0

SQL文字列を使用して選択値を変数に割り当てたいと思います。以下は私のコードです:

DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever';

select @maxRow=Max(id) from @tableName

しかし、これはエラーをスローします:

メッセージ 1087、レベル 16、状態 1、行 3
テーブル変数 "@tableName" を宣言する必要があります。

変数を宣言しましたが。

4

1 に答える 1

1

動的 SQL に入れない限り、テーブル名に変数を使用することはできません。コードは現在@tableName、文字列ではなくテーブル変数であると想定していますが、構文から明らかですが、これは意図したものではありません。この使用法は、最適化されていない設計のように思え、重大な SQL インジェクションのリスクにつながりますが、代わりに次のコードを試すことができます。

DECLARE @maxRow INT;

DECLARE @sql NVARCHAR(MAX) = N'SELECT @maxRow = MAX(id) FROM ' 
  + QUOTENAME(@tableName) + ';';

EXEC sp_executesql @sql, N'@maxRow INT OUTPUT', @maxRow OUTPUT;

PRINT @maxRow;

SQL インジェクションと正規化についてよく読んでください。

于 2013-08-26T21:09:55.990 に答える