1. ホーム
  2. sql

[解決済み] スカラー変数の宣言が必要

2022-03-01 02:35:41

質問

@RowFrom int

@RowTo int

は両方ともストアドプロシージャのグローバル入力パラメータで、ストアドプロシージャ内のSQLクエリをT-SQLでコンパイルしているので Exec(@sqlstatement) をストアドプロシージャの最後に使用して結果を表示しようとすると、このエラーが発生します。 @RowFrom または @RowTo の中に @sqlstatement という変数が実行されるのですが、それ以外は正常に動作しています。

"Must declare the scalar variable "@RowFrom"."


また、以下を含めてみたところ @sqlstatement 変数を使用します。

'Declare @Rt int'
'SET @Rt = ' + @RowTo

しかし @RowTo に値を渡さないままです。 @Rt となり、エラーが発生します。

解決方法は?

intを文字列に連結することはできません。代わりに

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;

必要です。

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);

ここで何が起こっているかを説明するために ここでは、@RowTo = 5とします。

DECLARE @RowTo int;
SET @RowTo = 5;

DECLARE @sql nvarchar(max);
SET @sql = N'SELECT ' + CONVERT(varchar(12), @RowTo) + ' * 5';
EXEC sys.sp_executesql @sql;

これを文字列に組み上げるには(最終的には数字になるとしても)、変換する必要がありますね。しかし、ご覧の通り、実行時にはまだ数字として扱われます。答えは25ですよね?

あなたの場合、連結を使用するよりも、適切なパラメータ化を使用することができ、その習慣が身につけば、いつかはSQLインジェクションに身をさらすことになります( これ これ :

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;