sql server -在c#中使用sql参数DROP INDEX

本文关键字:sql 参数 DROP INDEX server | 更新日期: 2023-09-27 17:52:39

我试图遵循最佳实践(并删除Visual Studio代码分析警告),当删除SQL Server索引时使用参数。

不使用参数也可以:

string tableName = "dbo.TableName";
SqlCommand sqlCommand = new SqlCommand("DROP INDEX Blah ON " + tableName);
sqlCommand.Connection = sqlConnection;
sqlCommand.ExecuteNonQuery();

然而,当我尝试使用参数时,我得到一个错误

'@TableName'附近语法错误。

代码:

string tableName = "dbo.TableName";
SqlCommand sqlCommand = new SqlCommand("DROP INDEX Blah ON @TableName");
sqlCommand.Parameters.Add(new SqlParameter("TableName", tableName));
sqlCommand.Connection = sqlConnection;
sqlCommand.ExecuteNonQuery();

我做错了什么?

sql server -在c#中使用sql参数DROP INDEX

你没有做错什么。参数不能用来替换标识符——列名/别名、表名/别名、模式名和数据库名。它们也不能用来替换函数名、操作符或关键字。

这是一个很长的列表。它们可以用来替换查询中的常量。

我想记住这一点的方法是参数化查询可以预编译。为了编译一个查询,需要解析所有的对象引用——因此不能通过形参提供值。

您已经通过将表放入字符串中解决了这个问题。您可以使用quotename()来帮助防止注入(见这里)。

DROP INDEX是DDL语句,大多数DDL语句不接受参数化值。最好的方法是使用动态构造的SQL,并使用QUOTENAME

转义表名
string tableName = "dbo.TableName";
string sql = @"
declare @sql nvarchar(500)
set @sql = N'DROP INDEX Blah ON ' + QUOTENAME(@TableName)
exec sp_executesql @sql
";
SqlCommand sqlCommand = new SqlCommand("");
sqlCommand.Parameters.Add("@TableName", SqlDbType.NVarChar, 50).Value = tableName;
sqlCommand.Connection = sqlConnection;
sqlCommand.ExecuteNonQuery();

我还更新了你的代码,使用更"正常"的方式来添加参数,显式设置参数的数据类型。