2016-06-28 6 views
3

SQL Serverインデックスを削除するときにパラメータを使用して、ベストプラクティスに従うようにしています(Visual Studioのコード分析の警告も削除します)。C#のDROP INDEXにSQLパラメータを使用する

は、パラメータを使用していないが正常に動作します:

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

は私が間違って何をしているのですか?

+0

"@TableName"にする必要がありますか? –

+0

@EricJ。 'SqlParameter'は自動的に' @ 'を追加します。 –

答えて

4

何も間違っていません。カラム名/エイリアス、テーブル名/エイリアス、スキーマ名、データベース名など、識別子を置換するためのパラメータは使用できません。また、関数名や演算子やキーワードを置き換えることもできません。

これは長いリストです。これらを使用すると、クエリの定数を置き換えることができます。

これは、パラメータ化されたクエリを事前にコンパイルできることを覚えておくと思います。クエリをコンパイルするには、すべてのオブジェクト参照を解決する必要があります。そのため、パラメータで値を提供することはできません。

既に文字列にテーブルを入れることで問題は解決しました。 quotename()を使用して注射から保護することができます(hereを参照)。

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

使用して、テーブル名をエスケープです。

関連する問題