Saya mencoba untuk mencapai sesuatu di sepanjang garis untuk masing-masing, di mana saya ingin mengambil Id pernyataan pilih kembali dan menggunakan masing-masing.
DECLARE @i int
DECLARE @PractitionerId int
DECLARE @numrows int
DECLARE @Practitioner TABLE (
idx smallint Primary Key IDENTITY(1,1)
, PractitionerId int
)
INSERT @Practitioner
SELECT distinct PractitionerId FROM Practitioner
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM Practitioner)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(idx) FROM Practitioner))
BEGIN
SET @PractitionerId = (SELECT PractitionerId FROM @Practitioner WHERE idx = @i)
--Do something with Id here
PRINT @PractitionerId
SET @i = @i + 1
END
Saat ini saya memiliki sesuatu yang terlihat seperti di atas, tetapi saya mendapatkan kesalahan:
Nama kolom 'idx' tidak valid.
Bisakah seseorang
sql-server
tsql
Pomster
sumber
sumber
idx
adalah@Practitioner
tidakPractitioner
. Ada paling sering alternatif set-based yang unggul untuk setiap pendekatan, jika Anda menunjukkan apa yang Anda lakukan dengan nilai baris, mungkin sebuah alternatif dapat disarankan.--Do something with Id here
ada, kemungkinan kami dapat menunjukkan kepada Anda bagaimana menyelesaikan masalah ini tanpa ada loop atau kursor. Dalam kebanyakan kasus, Anda ingin menggunakan solusi berbasis set, karena itulah cara SQL Server dioptimalkan untuk bekerja. Berkeliaran dan merawat satu baris pada satu waktu tentu memiliki tempatnya, tetapi saya curiga ini bukan.Jawaban:
Anda sepertinya ingin menggunakan a
CURSOR
. Meskipun sebagian besar waktu terbaik untuk menggunakan solusi berbasis set, ada beberapa kali di mana aCURSOR
adalah solusi terbaik. Tanpa mengetahui lebih banyak tentang masalah Anda yang sebenarnya, kami tidak dapat membantu Anda lebih dari itu:sumber
Misalkan kolom PractitionerId adalah unik, maka Anda dapat menggunakan loop berikut
sumber
Hitungan pilih dan maks pilih Anda harus dari variabel tabel Anda, bukan tabel sebenarnya
sumber
Ini umumnya (hampir selalu) berkinerja lebih baik daripada kursor dan lebih sederhana:
sumber
Saya akan mengatakan semuanya mungkin berfungsi kecuali bahwa kolom
idx
tidak benar-benar ada di tabel yang Anda pilih. Mungkin Anda bermaksud memilih dari@Practitioner
:karena itu didefinisikan dalam kode di atas seperti itu:
sumber
Baris berikut salah dalam versi Anda:
(Tidak ada @)
Mungkin ide untuk mengubah konvensi penamaan Anda sehingga tabel lebih berbeda.
sumber
Meskipun kursor biasanya dianggap jahat yang mengerikan, saya percaya ini adalah kasus untuk kursor FAST_FORWARD - hal terdekat yang bisa Anda dapatkan di FOREACH di TSQL.
sumber
Saya membuat prosedur yang menjalankan
FOREACH
denganCURSOR
untuk tabel apa pun.Contoh penggunaan:
Hasilnya adalah 2 pilihan untuk setiap baris. Sintaks
UPDATE
dan breakFOREACH
ditulis dalam petunjuk.Ini adalah kode proc:
sumber
Saya datang dengan cara yang sangat efektif, (saya pikir) dapat dibaca untuk melakukan ini.
Ini kodenya. Maaf, ini menggunakan nama variabel saya dan bukan yang ada di pertanyaan.
sumber
Inilah salah satu solusi yang lebih baik.
Kita dapat mengakses atau kita dapat melakukan apa saja di tubuh loop dan kita dapat mengakses idx dengan mendefinisikannya di dalam definisi tabel.
sumber