C# 在C中使用SQL参数删除索引#
我试图通过在删除SQL Server索引时使用参数来遵循最佳实践(并删除Visual Studio代码分析警告) 不使用参数可以正常工作: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()
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();