「スカラー変数を宣言しなければならない」という謎を解明する
SQL ストアド プロシージャの領域で、次のようなグローバル入力パラメータを利用しようとする動的に生成された SQL ステートメント内の「@RowFrom」と「@RowTo」は、多くの場合、複雑なエラーを引き起こす可能性があります。 「スカラー変数を宣言する必要があります。」
この問題は、クエリのコンパイルに使用される SQL 文字列 (@sqlstatement) 内でパラメーターが明示的に宣言されていないために発生します。これを修正するには、次のいずれかを行う必要があります:
CONVERT() を使用して変数を文字列に変換する:
int 型変数を直接連結する代わりに、CONVERT を使用します。 () を使用して文字列に変換します。例:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
これにより、"@RowTo" の値を文字列として "@Rt" に割り当てることができます。
最新の CONCAT() 関数を使用します。
新しい SQL バージョンでは、CONCAT() 関数によりパラメータの連結が簡素化され、手動変換が必要です。
SET @sql = CONCAT(N'SELECT ', @RowTo, ' * 5');
安全なパラメータ化を採用:
ただし、文字列連結ではなく適切なパラメータ化を選択することを強くお勧めします。このアプローチでは、SQL コードをユーザー入力パラメーターから分離することで、SQL インジェクションのリスクを最小限に抑えます。
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;'; EXEC sys.sp_executesql @sql, N'@RowFrom int, @RowTo int', @RowFrom, @RowTo;
以上がSQL ストアド プロシージャで「スカラー変数を宣言する必要があります」エラーがスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。