ホームページ > データベース > mysql チュートリアル > 動的 SQL の実行時に T-SQL ストアド プロシージャでグローバル入力パラメータを処理する方法

動的 SQL の実行時に T-SQL ストアド プロシージャでグローバル入力パラメータを処理する方法

DDD
リリース: 2024-12-15 00:07:13
オリジナル
762 人が閲覧しました

How to Handle Global Input Parameters in T-SQL Stored Procedures When Executing Dynamic SQL?

グローバル入力パラメータと SQL 実行に関するトラブル

T-SQL で SQL クエリをコンパイルし、EXEC を使用して実行するストアド プロシージャ内(@sqlstatement) を実行すると、「スカラー変数 "@RowFrom" を宣言する必要があります。」というエラーが発生する場合があります。 @sqlstatement 変数内でグローバル入力パラメーター @RowFrom および @RowTo を使用しようとすると。

問題の理解

パラメーター @RowFrom および @RowTo が原因でエラーが発生します。 @sqlstatement 文字列内では認識されません。これは、SQL 文字列は明示的な宣言がなければグローバル変数に直接アクセスできないためです。

解決策: Int を String に変換するか、適切なパラメータ化を使用する

この問題を解決するには 2 つのアプローチがあります。 :

  1. Int を String に変換: To @RowTo の整数値を文字列として渡すには、CONVERT 関数を使用します:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
ログイン後にコピー
  1. 適切なパラメータ化を使用します: 値を SQL 文字列に連結するのではなく、パラメータ化されたクエリを使用して、入力パラメータを安全に渡します。例:
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;
ログイン後にコピー

最新バージョンに関する考慮事項

最新バージョンの SQL では、文字列連結に CONCAT 関数を使用できます。

SET @sql = CONCAT(N'SELECT ', @RowTo, ' * 5');
ログイン後にコピー

ただし、SQL インジェクションを防ぐために適切なパラメータ化を使用することをお勧めします。脆弱性。

以上が動的 SQL の実行時に T-SQL ストアド プロシージャでグローバル入力パラメータを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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