C# 在C中使用SQL参数删除索引#

C# 在C中使用SQL参数删除索引#,c#,sql-server,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()

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

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

string tableName = "dbo.TableName";

SqlCommand sqlCommand = new SqlCommand("DROP INDEX Blah ON " + tableName);

sqlCommand.Connection = sqlConnection;
sqlCommand.ExecuteNonQuery();
然而,当我尝试使用一个参数时,我得到了一个错误

“@TableName”附近的语法不正确

代码:


我做错了什么?

你没有做错什么。参数不能用于替换标识符--列名/别名、表名/别名、架构名和数据库名。它们也不能用于替换函数名、运算符或关键字

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

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

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

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


我还更新了您的代码,以使用更“正常”的方式添加参数,显式设置参数的数据类型。

是否需要为“@TableName”?@EricJ<如果缺少
@
,则code>SqlParameter将自动添加
@
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();
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();