しなければならない場合 iterate(*)、それを行うために設計された構造を使用 - カーソル> .非常に中傷的ですが、それがあなたの意図を最も明確に表している場合は、それを使用してください:
DECLARE @ID intDECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name =@NameParameterOPEN IDsFETCH NEXT FROM IDs into @IDWHILE @@FETCH_STATUS =0BEGIN exec myproc @ID FETCH NEXT FROM IDs into @IDENDCLOSE IDsDEALLOCATE IDsコード> プレ>
(*) この回答には最近いくつかの賛成票が寄せられましたが、ここにも元のコメントを組み込み、いくつかの一般的なアドバイスを追加する必要があると感じています:
SQL では、一般的に セットベースのソリューションを求めます。言語全体はセットベースのソリューションを中心に据えられており、(ひいては) オプティマイザはセットベースのソリューションを適切に機能させることを重視しています。さらに、チューニングに利用できるツール オプティマイザーもセット指向です。テーブルへのインデックスの適用
いくつかあります 反復が最善のアプローチである状況。これらはほとんどなく、最適化に関する Jackson のルールに例えられるかもしれません - やらないでください - そして (専門家のみ) やらないでください まだ .
最初に、影響を受けるすべての行のセットに関して必要なものを定式化しようとする方がはるかに優れています-達成される全体的な変更は何ですか? - そして、その目標をカプセル化するクエリを作成してみてください。そうすることによって生成されたクエリが適切に実行されない場合 (または、各行を個別に処理する以外に何もできない他のコンポーネントがある場合) のみ、考慮する必要があります。 反復。