Jika Anda harus iterate(*), gunakan konstruksi yang dirancang untuk melakukannya - kursor . Banyak difitnah, tetapi jika itu paling jelas mengungkapkan niat Anda, saya katakan gunakan itu:
DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter
OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
exec myproc @ID
FETCH NEXT FROM IDs into @ID
END
CLOSE IDs
DEALLOCATE IDs
(*) Jawaban ini telah menerima beberapa upvotes baru-baru ini, tetapi saya merasa saya harus memasukkan komentar asli saya di sini juga, dan menambahkan beberapa saran umum:
Dalam SQL, Anda harus umumnya mencari solusi berbasis himpunan. Seluruh bahasa berorientasi pada solusi berbasis set, dan (pada gilirannya) pengoptimal berorientasi pada membuat solusi berbasis set bekerja dengan baik. Selanjutnya, alat yang kami miliki untuk penyetelan pengoptimal juga berorientasi pada set - mis. menerapkan indeks ke tabel.
Ada beberapa situasi di mana iterasi adalah pendekatan terbaik. Ini hanya sedikit, dan dapat disamakan dengan aturan Jackson tentang pengoptimalan - jangan lakukan itu - dan (hanya untuk pakar) jangan lakukan belum .
Anda jauh lebih baik dilayani untuk pertama-tama mencoba merumuskan apa yang Anda inginkan dalam hal kumpulan semua baris yang akan terpengaruh - apa perubahan keseluruhan yang ingin dicapai? - lalu coba rumuskan kueri yang merangkum tujuan tersebut. Hanya jika kueri yang dihasilkan dengan melakukannya tidak berkinerja memadai (atau ada beberapa komponen lain yang tidak dapat melakukan apa pun selain menangani setiap baris satu per satu) Anda harus mempertimbangkan iterasi.