SQL文字列を使用して選択値を変数に割り当てたいと思います。以下は私のコードです:
DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever';
select @maxRow=Max(id) from @tableName
しかし、これはエラーをスローします:
メッセージ 1087、レベル 16、状態 1、行 3
テーブル変数 "@tableName" を宣言する必要があります。
変数を宣言しましたが。
SQL文字列を使用して選択値を変数に割り当てたいと思います。以下は私のコードです:
DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever';
select @maxRow=Max(id) from @tableName
しかし、これはエラーをスローします:
メッセージ 1087、レベル 16、状態 1、行 3
テーブル変数 "@tableName" を宣言する必要があります。
変数を宣言しましたが。
動的 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 インジェクションと正規化についてよく読んでください。