Katakanlah saya memiliki variabel tabel sederhana berikut:
declare @databases table
(
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
Apakah mendeklarasikan dan menggunakan kursor adalah satu-satunya pilihan saya jika saya ingin mengulangi baris tersebut? Apakah ada cara lain?
sql-server
tsql
loops
sinar
sumber
sumber
STATIC
opsi untuk menghapus pemeriksaan ulang terus-menerus dari tabel dasar dan penguncian yang ada secara default dan menyebabkan sebagian besar orang secara keliru percaya bahwa CURSOR jahat. @ JacquesB sangat dekat: periksa kembali untuk melihat apakah baris hasil masih ada + penguncian adalah masalah. DanSTATIC
biasanya memperbaikinya :-).Jawaban:
Pertama-tama Anda harus benar-benar yakin Anda perlu mengulangi melalui setiap baris-set operasi berbasis akan melakukan lebih cepat dalam setiap kasus yang dapat saya pikirkan dan biasanya akan menggunakan kode yang lebih sederhana.
Tergantung pada data Anda, dimungkinkan untuk mengulang menggunakan
SELECT
pernyataan adil seperti yang ditunjukkan di bawah ini:Alternatif lain adalah dengan menggunakan tabel sementara:
Opsi yang harus Anda pilih benar-benar tergantung pada struktur dan volume data Anda.
Catatan: Jika Anda menggunakan SQL Server, Anda akan lebih baik dilayani menggunakan:
Menggunakan
COUNT
harus menyentuh setiap baris dalam tabel,EXISTS
hanya perlu menyentuh yang pertama (lihat jawaban Josef di bawah).sumber
STATIC
opsi yang menyalin hasil yang disetel ke tabel temp, dan karenanya Anda tidak lagi mengunci atau memeriksa ulang tabel dasar :-).Hanya catatan singkat, jika Anda menggunakan SQL Server (2008 dan di atas), contoh-contoh yang ada:
Akan lebih baik disajikan bersama
Hitungan harus menyentuh setiap baris dalam tabel,
EXISTS
hanya perlu menyentuh yang pertama.sumber
Beginilah cara saya melakukannya:
Tidak ada kursor, tidak ada tabel sementara, tidak ada kolom tambahan. Kolom USERID harus berupa bilangan bulat unik, seperti kebanyakan Kunci Utama.
sumber
Tentukan tabel temp Anda seperti ini -
Kemudian lakukan ini -
sumber
Inilah cara saya akan melakukannya:
[Sunting] Karena saya mungkin melewatkan kata "variabel" ketika pertama kali membaca pertanyaan, berikut ini adalah respons yang diperbarui ...
sumber
Jika Anda tidak punya pilihan selain pergi baris demi baris membuat kursor FAST_FORWARD. Ini akan secepat membangun loop sementara dan jauh lebih mudah untuk mempertahankan dalam jangka panjang.
FAST_FORWARD Menentukan FORWARD_ONLY, READ_ONLY kursor dengan optimasi kinerja diaktifkan. FAST_FORWARD tidak dapat ditentukan jika SCROLL atau FOR_UPDATE juga ditentukan.
sumber
FAST_FORWARD
kursor adalah solusi yang baik. (Pendekatan lain tanpa harus mengubah skema Anda atau menggunakan tabel temp:
sumber
Anda dapat menggunakan loop sementara:
sumber
Ini akan bekerja dalam versi SQL SERVER 2012.
sumber
Ringan, tanpa harus membuat tabel tambahan, jika Anda memiliki bilangan bulat
ID
di atas mejasumber
sumber
Saya benar-benar tidak mengerti mengapa Anda harus menggunakan ketakutan
cursor
. Tapi di sini ada opsi lain jika Anda menggunakan SQL Server versi 2005/2008Gunakan Rekursi
sumber
Saya akan memberikan solusi berbasis set.
Ini jauh lebih cepat daripada teknik perulangan dan lebih mudah untuk menulis dan memelihara.
sumber
Saya lebih suka menggunakan Pengambilan Offset jika Anda memiliki ID unik, Anda dapat mengurutkan tabel berdasarkan:
Dengan cara ini saya tidak perlu menambahkan bidang ke tabel atau menggunakan fungsi jendela.
sumber
Mungkin untuk menggunakan kursor untuk melakukan ini:
buat fungsi [dbo] .f_teste_loop mengembalikan tabel @tabela (cod int, nome varchar (10)) sebagai awal
akhir
buat prosedur [dbo]. [sp_teste_loop] sebagai awal
akhir
sumber
Saya setuju dengan posting sebelumnya bahwa operasi berbasis set biasanya akan berkinerja lebih baik, tetapi jika Anda perlu mengulangi baris berikut inilah pendekatan yang akan saya ambil:
Pilih catatan yang tidak digunakan berikutnya dari tabel dan ulangi prosesnya
sumber
Langkah1: Pernyataan pilih di bawah ini membuat tabel temp dengan nomor baris unik untuk setiap catatan.
Langkah2: Deklarasikan variabel yang diperlukan
Langkah 3: Ambil jumlah baris total dari tabel temp
Langkah4: Loop tabel temp berdasarkan nomor baris unik buat di temp
sumber
Pendekatan ini hanya memerlukan satu variabel dan tidak menghapus baris apa pun dari @databases. Saya tahu ada banyak jawaban di sini, tetapi saya tidak melihat jawaban yang menggunakan MIN untuk mendapatkan ID Anda berikutnya seperti ini.
sumber
Inilah solusi saya, yang menggunakan loop tak terbatas,
BREAK
pernyataan, dan@@ROWCOUNT
fungsinya. Tidak ada kursor atau tabel sementara yang diperlukan, dan saya hanya perlu menulis satu kueri untuk mendapatkan baris berikutnya dalam@databases
tabel:sumber
Ini adalah kode yang saya gunakan 2008 R2. Kode ini yang saya gunakan adalah untuk membuat indeks pada bidang kunci (SSNO & EMPR_NO) di semua kisah
sumber
akan lebih baik:
Hindari menggunakan SELECT jika Anda tidak mereferensikan tabel hanya memberikan nilai.
sumber