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
結果
結果を連結してExec
を呼び出しますか?
私は厳密に型指定されたパラメーターを使用して真の動的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;
プロシージャへのパラメーターに名前が付けられていないことはまだ好きではありません。パラメーター値のいずれかが文字列または日付である場合、一重引用符を作成するとすぐに煩わしくなります。
コマンドの表を選択します。次に、whileループでコマンドを実行します。
OR
入力データをテーブルに作成し、パラメーターを指定してsp_executesqlを使用してループします。