在C#中使用SQL参数DROP INDEX

时间:2016-06-28 02:06:59

标签: c# sql-server

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

不使用参数可以正常工作:

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();

我做错了什么?

2 个答案:

答案 0 :(得分:4)

你没有做错任何事。参数不能用于替换标识符 - 列名称/别名,表名称/别名,模式名称和数据库名称。它们也不能用于替换函数名称或运算符或关键字。

这是一个很长的清单。它们可用于替换查询中的常量。

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

您已经通过将表放在字符串中来解决问题。您可以使用quotename()来帮助防止注射(请参阅here)。

答案 1 :(得分:3)

DROP INDEX是DDL statement,大多数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();

我还更新了您的代码以使用更多" normal"添加参数的方法,显式设置参数的数据类型。