web-dev-qa-db-ja.com

選択から生成された動的SQLを実行する

SQLのビジネスプロセスは、各操作に対して変数を生成できます。その目的は、メインプロセスに関連するデータを挿入することを目的とするストアドプロシージャへの1-Nの呼び出しです。

Selectから生成されたSQLの複数の行をどのように実行しますか、またはselectからストアドプロシージャを呼び出す方法はありますか?


このステップの前のプロセスは、ビジネスロジックとデータ駆動型操作の複雑な操作であり、関連するFK結合テーブルへの後続の挿入を実行しています。

ストアドプロシージャを呼び出す必要があるその時点で、テーブル変数で処理する準備ができたデータがあります。ストアドプロシージャを呼び出すステップ(プロシージャ内のロジック)は、ストアドプロシージャ内にあることに意味のある関連プロセスであり、既存のプロシージャにコピーすることはできません。


Selectによって生成された生成コードの偽の例。

SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId)           + ', '
                                + Convert(varchar(6), @ROIResultId)         + ', '
                                + CONVERT(varchar(6), RT.routeTypeResultId) + ', '
                                + CONVERT(varchar(6), RT.ROI_RouteTypeId)   + '; '
FROM  @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId 

結果

enter image description here

結果を連結してExecを呼び出しますか?

2
ΩmegaMan

私は厳密に型指定されたパラメーターを使用して真の動的SQLステートメントを生成することを好みますが、適切な方法ははるかに面倒になるため、ここではおそらく連結で問題ありません。しかし、私は常に EXEC() よりもsp_executesqlを優先します。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql = @sql + N'EXEC [sim].[ROI_Save] ' 
        + CONVERT(varchar(6), VSL.PathId)           + N', '
        + CONVERT(varchar(6), @ROIResultId)         + N', '
        + CONVERT(varchar(6), RT.routeTypeResultId) + N', '
        + CONVERT(varchar(6), RT.ROI_RouteTypeId)   + N'; '
FROM  @routeResultIds AS RT
JOIN sim.ROI_Result_Vehicle AS VSL 
ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId;

EXEC sys.sp_executesql @sql;

プロシージャへのパラメーターに名前が付けられていないことはまだ好きではありません。パラメーター値のいずれかが文字列または日付である場合、一重引用符を作成するとすぐに煩わしくなります。

5
Aaron Bertrand

コマンドの表を選択します。次に、whileループでコマンドを実行します。

OR

入力データをテーブルに作成し、パラメーターを指定してsp_executesqlを使用してループします。

1
WaitForPete