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).
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-SQLSELECT
atauEXECUTE
pernyataan yang memanggil prosedur tersimpan yang berisi satuSELECT
pernyataan harus digunakan. Selain itu,SELECT
pernyataan harus memenuhi syarat sebagai kursor; artinya, tidak dapat berisi kata kunciSELECT INTO
atauFOR 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 punSELECT
yang berisi kata kunciSELECT INTO
atauFOR BROWSE
dijalankan, dan tidak menghasilkan pembuatan kursor. Hal yang sama berlaku untuk pernyataan apa punSELECT
yang disertakan dalam batch beberapa pernyataan. Dalam kasus di manaSELECT
pernyataan berisi klausul yang hanya berkaitan dengan kursor, klausa tersebut diabaikan. Misalnya, ketika nilai ccopt adalah0x2002
, ini adalah permintaan untuk:Kursor dengan kunci gulir, jika hanya ada satu
SELECT
pernyataan yang memenuhi syarat sebagai kursor, atauEksekusi pernyataan langsung jika ada beberapa pernyataan, satu pernyataan non-
SELECT
, atauSELECT
pernyataan yang tidak memenuhi syarat sebagai kursor.
Parameter scrollopt
Lima nilai scrollopt pertama (KEYSEY
, , DYNAMIC
, FORWARD_ONLY
STATIC
, 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_ACCEPTABLE
STATIC_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.