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();
我做错了什么?
你没有做错什么。参数不能用来替换标识符——列名/别名、表名/别名、模式名和数据库名。它们也不能用来替换函数名、操作符或关键字。
这是一个很长的列表。它们可以用来替换查询中的常量。
我想记住这一点的方法是参数化查询可以预编译。为了编译一个查询,需要解析所有的对象引用——因此不能通过形参提供值。
您已经通过将表放入字符串中解决了这个问题。您可以使用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();
我还更新了你的代码,使用更"正常"的方式来添加参数,显式设置参数的数据类型。