1. ホーム
  2. sql

[解決済み] クエリが返す各行に対してストアドプロシージャを1回ずつ実行するにはどうすればよいですか?

2022-04-07 16:38:07

質問

ある方法でユーザーデータを変更するストアドプロシージャがあります。user_idを渡すと、それが実行されます。私はテーブル上でクエリを実行し、私が見つけた各ユーザーIDについて、そのユーザーIDでストアドプロシージャを一度実行したいのです。

どのようにクエリを書けばいいのでしょうか?

どのように解決するのですか?

カーソルを使う

ADDENDUM: [MS SQLカーソルの例]です。

declare @field1 int
declare @field2 int
declare cur CURSOR LOCAL for
    select field1, field2 from sometable where someotherfield is null

open cur

fetch next from cur into @field1, @field2

while @@FETCH_STATUS = 0 BEGIN

    --execute your sproc on each row
    exec uspYourSproc @field1, @field2

    fetch next from cur into @field1, @field2
END

close cur
deallocate cur

をMS SQLで実行します。 以下は記事の例です。

カーソルはセットベースの操作より遅いが、手動の while ループより速いことに注意; 詳細 このSOの質問で

補足2: もし数レコード以上の処理を行うのであれば、まずそれらを一時テーブルに取り込み、カーソルをその一時テーブル上で実行します。

ADDENDUM 3: もちろん、ストアドプロシージャが各ユーザーIDに対して行っていることをインライン化し、全体を1つのSQL更新文として実行できれば、それが最適となります。