Bagikan melalui


sp_cursoropen (T-SQL)

Berlaku untuk: SQL Server

Membuka kursor. sp_cursoropen menentukan pernyataan SQL yang terkait dengan opsi kursor dan kursor, lalu mengisi kursor. sp_cursoropen setara dengan kombinasi pernyataan DECLARE_CURSOR Transact-SQL dan OPEN. Prosedur ini dipanggil dengan menentukan ID = 2 dalam paket aliran data tabular (TDS).

Konvensi sintaks transact-SQL

Sintaks

sp_cursoropen cursor OUTPUT
    , stmt
    [ , scrollopt [ OUTPUT ]
    [ , ccopt [ OUTPUT ]
    [ , rowcount OUTPUT [ , boundparam ] [ , ...n ] ] ] ]
[ ; ]

Argumen

Kursor

Pengidentifikasi kursor yang dihasilkan SQL Server. kursor adalah handle nilai yang harus disediakan pada semua prosedur berikutnya yang melibatkan kursor, seperti sp_cursorfetch. Parameter kursor adalah int dan tidak boleh NULL.

kursor memungkinkan beberapa kursor aktif pada satu koneksi database.

stmt

Parameter yang diperlukan yang menentukan tataan hasil kursor. Setiap string kueri yang valid (sintaks dan pengikatan) dari jenis string apa pun (terlepas dari Unicode, ukuran, dll.) dapat berfungsi sebagai jenis nilai stmt yang valid.

scrollopt

Opsi gulir. Parameter scrollopt adalah int, dengan default NULL, dan bisa menjadi salah satu nilai berikut.

Nilai Deskripsi
0x0001 KEYSET
0x0002 DYNAMIC
0x0004 FORWARD_ONLY
0x0008 STATIC
0x10 FAST_FORWARD
0x1000 PARAMETERIZED_STMT
0x2000 AUTO_FETCH
0x4000 AUTO_CLOSE
0x8000 CHECK_ACCEPTED_TYPES
0x10000 KEYSET_ACCEPTABLE
0x20000 DYNAMIC_ACCEPTABLE
0x40000 FORWARD_ONLY_ACCEPTABLE
0x80000 STATIC_ACCEPTABLE
0x100000 FAST_FORWARD_ACCEPTABLE

Karena kemungkinan bahwa nilai yang diminta tidak sesuai untuk kursor yang ditentukan oleh stmt, parameter ini berfungsi sebagai input dan output. Dalam kasus seperti itu, SQL Server menetapkan nilai yang sesuai.

ccopt

Opsi kontrol konkurensi. ccopt adalah parameter opsional yang memerlukan salah satu nilai input int berikut.

Nilai Deskripsi
0x0001 READ_ONLY
0x0002 SCROLL_LOCKS (sebelumnya dikenal sebagai LOCKCC)
0x0004 OPTIMISTIC (sebelumnya dikenal sebagai OPTCC)
0x0008 OPTIMISTIC (sebelumnya dikenal sebagai OPTCCVAL)
0x2000 ALLOW_DIRECT
0x4000 UPDT_IN_PLACE
0x8000 CHECK_ACCEPTED_OPTS
0x10000 READ_ONLY_ACCEPTABLE
0x20000 SCROLL_LOCKS_ACCEPTABLE
0x40000 OPTIMISTIC_ACCEPTABLE
0x80000 OPTIMISITC_ACCEPTABLE

Seperti halnya scrollopt, SQL Server dapat mengambil alih nilai ccopt yang diminta.

rowcount

Jumlah baris buffer pengambilan untuk digunakan dengan AUTO_FETCH. Defaultnya adalah 20 baris. rowcount bertingkah berbeda saat ditetapkan sebagai nilai input versus nilai pengembalian.

Sebagai nilai input Sebagai nilai yang dikembalikan
AUTO_FETCH Saat nilai scrollopt ditentukan, rowcount mewakili jumlah baris yang akan ditempatkan ke dalam buffer pengambilan.

Catatan: > 0 adalah nilai yang valid ketika AUTO_FETCH ditentukan, tetapi diabaikan.
Mewakili jumlah baris dalam tataan hasil, kecuali ketika nilai scrollopt AUTO_FETCH ditentukan.

boundparam

Menandakan penggunaan parameter tambahan. boundparam adalah parameter opsional yang harus ditentukan jika nilai scrollopt PARAMETERIZED_STMT diatur ke ON.

Mengembalikan nilai kode

Jika tidak ada kesalahan yang dimunculkan, sp_cursoropen mengembalikan salah satu nilai berikut.

Nilai Deskripsi
0 Prosedur berhasil dijalankan.
0x0001 Terjadi kesalahan selama eksekusi (kesalahan kecil, tidak cukup parah untuk memunculkan kesalahan dalam operasi).
0x0002 Operasi asinkron sedang berlangsung.
0x0002 Operasi FETCH sedang dalam proses.
A Kursor ini dibatalkan alokasinya dan tidak tersedia.

Ketika kesalahan dimunculkan, nilai yang dikembalikan mungkin tidak konsisten dan akurasi tidak dapat dijamin.

Saat parameter rowcount ditentukan sebagai nilai pengembalian, kumpulan hasil berikut terjadi.

Nilai Deskripsi
-1 Dikembalikan jika jumlah baris tidak diketahui atau tidak berlaku.
-n Dikembalikan ketika populasi asinkron berlaku. Mewakili jumlah baris yang ditempatkan ke dalam buffer pengambilan saat nilai scrollopt AUTO_FETCH ditentukan.

Jika RPC sedang digunakan, nilai yang dikembalikan adalah sebagai berikut.

Nilai Deskripsi
0 Prosedur berhasil.
1 Prosedur gagal.
2 Kursor set kunci sedang dihasilkan secara asinkron.
16 Kursor maju cepat ditutup secara otomatis.

sp_cursoropen Jika prosedur berhasil dijalankan, parameter pengembalian RPC dan tataan hasil dengan informasi format kolom TDS (0xa0 dan 0xa1 pesan) dikirim. Jika tidak berhasil, satu atau beberapa pesan kesalahan TDS dikirim. Dalam kedua kasus, tidak ada data baris yang dikembalikan dan DONE jumlah pesannya adalah 0. 0x81 dikembalikan (standar untuk SELECT pernyataan) bersama dengan 0xa5 aliran token dan 0xa4 .

Keterangan

Parameter stmt

Jika stmt menentukan eksekusi prosedur tersimpan, parameter input mungkin didefinisikan sebagai konstanta sebagai bagian dari string stmt , atau ditentukan sebagai argumen boundparam . Variabel yang dideklarasikan dapat diteruskan sebagai parameter terikat dengan cara ini.

Konten yang diizinkan dari parameter stmt bergantung pada apakah nilai pengembalian ccopt ALLOW_DIRECT ditautkan oleh OR ke nilai ccopt lainnya:

  • Jika ALLOW_DIRECT tidak ditentukan, baik Transact-SQL SELECT atau EXECUTE pernyataan yang memanggil prosedur tersimpan yang berisi satu SELECT pernyataan harus digunakan. Selain itu, SELECT pernyataan harus memenuhi syarat sebagai kursor; artinya, tidak dapat berisi kata kunci SELECT INTO atau FOR BROWSE.

  • Jika ALLOW_DIRECT ditentukan, ini dapat mengakibatkan satu atau beberapa pernyataan Transact-SQL, termasuk pernyataan yang menjalankan prosedur tersimpan lainnya dengan beberapa pernyataan. Pernyataan non-atauSELECT pernyataan apa pun SELECT yang berisi kata kunci SELECT INTO atau FOR BROWSE dijalankan, dan tidak menghasilkan pembuatan kursor. Hal yang sama berlaku untuk pernyataan apa pun SELECT yang disertakan dalam batch beberapa pernyataan. Dalam kasus di mana SELECT pernyataan berisi klausul yang hanya berkaitan dengan kursor, klausa tersebut diabaikan. Misalnya, ketika nilai ccopt adalah 0x2002, ini adalah permintaan untuk:

    • Kursor dengan kunci gulir, jika hanya ada satu SELECT pernyataan yang memenuhi syarat sebagai kursor, atau

    • Eksekusi pernyataan langsung jika ada beberapa pernyataan, satu pernyataan non-SELECT , atau SELECT pernyataan yang tidak memenuhi syarat sebagai kursor.

Parameter scrollopt

Lima nilai scrollopt pertama (KEYSEY, , DYNAMIC, FORWARD_ONLYSTATIC, dan FAST_FORWARD) saling eksklusif.

PARAMETERIZED_STMT dan CHECK_ACCEPTED_TYPES dapat ditautkan dengan OR ke salah satu dari lima nilai pertama.

AUTO_FETCH dan AUTO_CLOSE dapat ditautkan dengan OR ke FAST_FORWARD.

Jika CHECK_ACCEPTED_TYPES adalah ON, setidaknya salah satu dari lima nilai scrollopt terakhir (KEYSET_ACCEPTABLE, , DYNAMIC_ACCEPTABLE, FORWARD_ONLY_ACCEPTABLESTATIC_ACCEPTABLE, atau FAST_FORWARD_ACCEPTABLE) juga harus ON.

STATIC kursor selalu dibuka sebagai READ_ONLY. Ini berarti bahwa tabel yang mendasar tidak dapat diperbarui melalui kursor ini.

Parameter ccopt

Empat nilai ccopt pertama (READ_ONLY, SCROLL_LOCKS, dan kedua OPTIMISTIC nilai) saling eksklusif.

Catatan

Memilih salah satu dari empat nilai ccopt pertama menentukan apakah kursor bersifat baca-saja, atau jika metode penguncian atau optimis digunakan untuk mencegah pembaruan yang hilang. Jika nilai ccopt tidak ditentukan, nilai defaultnya adalah OPTIMISTIC.

ALLOW_DIRECT dan CHECK_ACCEPTED_TYPES dapat ditautkan dengan OR ke salah satu dari empat nilai pertama.

UPDT_IN_PLACE dapat ditautkan dengan OR ke READ_ONLY, SCROLL_LOCKS, atau salah OPTIMISTIC satu nilai.

Jika CHECK_ACCEPTED_TYPES adalah ON, setidaknya salah satu dari empat nilai ccopt terakhir (READ_ONLY_ACCEPTABLE, SCROLL_LOCKS_ACCEPTABLE, dan salah OPTIMISTIC_ACCEPTABLE satu nilai) juga harus AKTIF.

Diposisikan dan fungsi mungkin hanya dilakukan dalam buffer pengambilan dan hanya jika nilai ccopt sama atau SCROLL_LOCKS OPTIMISTIC.DELETE UPDATE Jika SCROLL_LOCKS merupakan nilai yang ditentukan, operasi dijamin berhasil. Jika OPTIMISTIC adalah nilai yang ditentukan, operasi gagal jika baris berubah sejak terakhir diambil.

Alasan kegagalan ini adalah ketika OPTIMISTIC adalah nilai yang ditentukan, fungsi kontrol mata uang optimis dilakukan dengan membandingkan tanda waktu atau nilai checksum, seperti yang ditentukan oleh SQL Server. Jika salah satu baris ini tidak cocok, operasi gagal.

Menentukan UPDT_IN_PLACE sebagai nilai pengembalian mengatur hasil berikut:

  • Jika tidak diatur saat melakukan pembaruan yang diposisikan pada tabel dengan indeks unik, kursor menghapus baris dari tabel kerjanya dan menyisipkannya di akhir salah satu kolom kunci yang digunakan oleh kursor, yang mengubah kolom tersebut.

  • Jika diatur ON, kursor memperbarui kolom kunci di baris asli tabel kerja.

Parameter bound_param

Nama parameter harus paramdef ketika PARAMETERIZED_STMT ditentukan, sesuai dengan pesan kesalahan dalam kode. Ketika PARAMETERIZED_STMT tidak ditentukan, tidak ada nama yang ditentukan dalam pesan kesalahan.

Pertimbangan RPC

Bendera input RPC RETURN_METADATA dapat diatur ke 0x0001 untuk meminta agar kursor memilih metadata daftar dikembalikan di aliran TDS.

Contoh

J. Parameter bound_param

Parameter apa pun setelah kelima diteruskan ke rencana pernyataan sebagai parameter input. Parameter pertama tersebut harus berupa string dalam formulir berikut:

<parameter_name> <data_type> [ ,... n ]

Parameter berikutnya digunakan untuk meneruskan nilai yang akan digantikan dalam <parameter_name> pernyataan.