特定の口座の特定の銀行口座情報を検証するSQLストアドプロシージャ「A」があり、引数「arg1」として口座番号を受け入れます。
別のテーブルXXXの列Xにあるすべての値(Accountsテーブルにあるすべての銀行口座)に対してプロシージャを実行したい
このようなものがうまくいくかどうかはわかりません
exec A @arg1 = X from XXX
前もって感謝します!
特定の口座の特定の銀行口座情報を検証するSQLストアドプロシージャ「A」があり、引数「arg1」として口座番号を受け入れます。
別のテーブルXXXの列Xにあるすべての値(Accountsテーブルにあるすべての銀行口座)に対してプロシージャを実行したい
このようなものがうまくいくかどうかはわかりません
exec A @arg1 = X from XXX
前もって感謝します!
いいえ、実行したい方法でバルクEXECはありません。
オプション1:手動で生成して実行します。結果をコピーし、SSMSに貼り付けて、実行します。
select 'exec A @arg1 = ' + quotename(X,'''') + ';'
from XXX
オプション2:バッチを生成し、動的SQLを使用して実行します。
declare @sql nvarchar(max);
set @sql = '';
select @sql = @sql + 'exec A @arg1 = ' + quotename(X,'''') + ';'
from XXX;
exec (@sql);
オプション3:ループで実行する
declare @x varchar(max);
select top(1) @x = X from xxx where X is not null order by X;
while @@rowcount > 0
begin
exec sp_executesql N'exec A @arg1=@x;', N'@x varchar(max)', @x=@x;
select top(1) @x = X from xxx where X > @x order by X;
end;
一般に、セットベースの方法で物事にアプローチする方が良いですが、結果セットの各行に対して実際に順番に何かを行う必要がある場合は、カーソルを使用する方法を次に示します。
declare cur cursor for
select X from XXX
declare @x int
open cur
fetch next from cur into @x
while @@FETCH_STATUS = 0
BEGIN
exec A @x
fetch next from cur into @x
END
Coalesceコマンドで動的クエリを使用してみてください。以下のクエリは、XXXテーブルのX列のデータに対してストアドプロシージャを実行します。
-- Create Dynamic Query
DECLARE @ValidateAccountCommand VARCHAR(MAX)
SELECT @ValidateAccountCommand = COALESCE(@ValidateAccountCommand +
'; EXEC A ',
'EXEC A ')
+ CONVERT(NVARCHAR,XxxData.X)
FROM
(SELECT X FROM XXX) XxxData
PRINT @ValidateAccountCommand
EXECUTE (@ValidateAccountCommand)