ホームページ > データベース > mysql チュートリアル > SQL ストアド プロシージャで「スカラー変数を宣言する必要があります」エラーがスローされるのはなぜですか?

SQL ストアド プロシージャで「スカラー変数を宣言する必要があります」エラーがスローされるのはなぜですか?

Patricia Arquette
リリース: 2024-12-23 00:52:10
オリジナル
964 人が閲覧しました

Why Does My SQL Stored Procedure Throw a

「スカラー変数を宣言しなければならない」という謎を解明する

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート