Bagikan melalui


Kursor (SQL Server)

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Operasi dalam database relasional bertindak pada sekumpulan baris lengkap. Misalnya, kumpulan baris yang SELECT dikembalikan oleh pernyataan terdiri dari semua baris yang memenuhi kondisi dalam WHERE klausul pernyataan. Kumpulan baris lengkap yang dikembalikan oleh pernyataan ini dikenal sebagai tataan hasil. Aplikasi, terutama aplikasi online interaktif, tidak selalu dapat bekerja secara efektif dengan seluruh hasil yang ditetapkan sebagai unit. Aplikasi ini membutuhkan mekanisme untuk bekerja dengan satu baris atau blok kecil baris pada satu waktu. Kursor adalah ekstensi untuk kumpulan hasil yang menyediakan mekanisme tersebut.

Kursor memperpanjang pemrosesan hasil dengan:

  • Mengizinkan penempatan pada baris tertentu dari tataan hasil.

  • Mengambil satu baris atau blok baris dari posisi saat ini dalam tataan hasil.

  • Mendukung modifikasi data pada baris pada posisi saat ini dalam tataan hasil.

  • Mendukung berbagai tingkat visibilitas terhadap perubahan yang dibuat oleh pengguna lain ke data database yang disajikan dalam tataan hasil.

  • Menyediakan pernyataan Transact-SQL dalam skrip, prosedur tersimpan, dan memicu akses ke data dalam kumpulan hasil.

Keterangan

Dalam beberapa skenario, jika ada kunci utama pada tabel, perulangan WHILE dapat digunakan alih-alih kursor, tanpa menimbulkan overhead kursor.

Namun, ada skenario di mana kursor tidak hanya tidak dapat ditolak, mereka benar-benar diperlukan. Jika demikian, jika tidak ada persyaratan untuk memperbarui tabel berdasarkan kursor, maka gunakan kursor firehose , yang berarti kursor cepat maju dan baca-saja .

Implementasi kursor

SQL Server mendukung tiga implementasi kursor.

Implementasi kursor Deskripsi
Kursor T-SQL Kursor Transact-SQL didasarkan pada DECLARE CURSOR sintaks dan digunakan terutama dalam skrip Transact-SQL, prosedur tersimpan, dan pemicu. Kursor Transact-SQL diimplementasikan di server dan dikelola oleh pernyataan Transact-SQL yang dikirim dari klien ke server. Mereka mungkin juga terkandung dalam batch, prosedur tersimpan, atau pemicu.
Kursor server antarmuka pemrograman aplikasi (API) Kursor API mendukung fungsi kursor API di OLE DB dan ODBC. Kursor server API diimplementasikan di server. Setiap kali aplikasi klien memanggil fungsi kursor API, penyedia SQL Server Native Client OLE DB atau driver ODBC mengirimkan permintaan ke server untuk tindakan terhadap kursor server API.
Kursor klien Kursor klien diimplementasikan secara internal oleh driver ODBC SQL Server Native Client dan oleh DLL yang mengimplementasikan API ADO. Kursor klien diimplementasikan dengan penembolokan semua baris tataan hasil pada klien. Setiap kali aplikasi klien memanggil fungsi kursor API, driver ODBC SQL Server Native Client atau DLL ADO melakukan operasi kursor pada baris kumpulan hasil yang di-cache pada klien.

Jenis kursor

SQL Server mendukung empat jenis kursor.

Kursor dapat menggunakan tempdb worktable. Sama seperti operasi agregasi atau pengurutan yang meluap, ini dikenakan biaya I/O, dan merupakan penyempitan performa potensial. STATIC kursor menggunakan worktable dari awalnya. Untuk informasi selengkapnya, lihat bagian worktables di panduan arsitektur pemrosesan kueri.

Teruskan saja

Kursor khusus penerusan ditentukan sebagai FORWARD_ONLY dan READ_ONLY dan tidak mendukung pengguliran. Ini juga disebut kursor firehose dan dukungan hanya mengambil baris secara serial dari awal hingga akhir kursor. Baris tidak diambil dari database hingga diambil. Efek dari semua INSERTpernyataan , UPDATE, dan DELETE yang dibuat oleh pengguna saat ini atau diterapkan oleh pengguna lain yang memengaruhi baris dalam kumpulan hasil terlihat saat baris diambil dari kursor.

Karena kursor tidak dapat digulir mundur, sebagian besar perubahan yang dilakukan pada baris dalam database setelah baris diambil tidak terlihat melalui kursor. Dalam kasus di mana nilai yang digunakan untuk menentukan lokasi baris dalam tataan hasil dimodifikasi, seperti memperbarui kolom yang dicakup oleh indeks berkluster, nilai yang dimodifikasi terlihat melalui kursor.

Meskipun model kursor API database menganggap kursor forward-only sebagai jenis kursor yang berbeda, SQL Server tidak. SQL Server mempertimbangkan hanya maju dan menggulir sebagai opsi yang dapat diterapkan ke kursor statis, berbasis set kunci, dan dinamis. Kursor Transact-SQL mendukung kursor statis, berbasis keyset, dan dinamis khusus ke depan. Model kursor API database mengasumsikan bahwa kursor statis, berbasis keyset, dan dinamis selalu dapat digulir. Saat atribut atau properti kursor API database diatur ke forward-only, SQL Server mengimplementasikan ini sebagai kursor dinamis khusus penerusan.

Statis

Kumpulan hasil lengkap kursor statis dibangun saat tempdb kursor dibuka. Kursor statis selalu menampilkan tataan hasil seperti saat kursor dibuka. Kursor statis mendeteksi beberapa atau tidak ada perubahan, tetapi mengonsumsi sumber daya yang relatif sedikit saat menggulir.

Kursor tidak mencerminkan perubahan apa pun yang dibuat dalam database yang memengaruhi keanggotaan tataan hasil atau perubahan pada nilai dalam kolom baris yang membentuk tataan hasil. Kursor statis tidak menampilkan baris baru yang disisipkan dalam database setelah kursor dibuka, bahkan jika cocok dengan kondisi pencarian pernyataan kursor SELECT . Jika baris yang membentuk kumpulan hasil diperbarui oleh pengguna lain, nilai data baru tidak ditampilkan di kursor statis. Kursor statis menampilkan baris yang dihapus dari database setelah kursor dibuka. Tidak ada UPDATEoperasi , INSERT, atau DELETE yang tercermin dalam kursor statis (kecuali kursor ditutup dan dibuka kembali), bahkan tidak modifikasi yang dilakukan menggunakan koneksi yang sama yang membuka kursor.

Catatan

Kursor statis SQL Server selalu baca-saja.

Karena kumpulan hasil kursor statis disimpan dalam worktable di tempdb, ukuran baris dalam tataan hasil tidak boleh melebihi ukuran baris maksimum untuk tabel SQL Server.

Untuk informasi selengkapnya, lihat bagian worktables di panduan arsitektur pemrosesan kueri. Untuk informasi selengkapnya tentang ukuran baris maks, lihat Spesifikasi kapasitas maksimum untuk SQL Server.

Transact-SQL menggunakan istilah tidak sensitif untuk kursor statis. Beberapa API database mengidentifikasinya sebagai kursor rekam jepret.

Set kunci

Keanggotaan dan urutan baris dalam kursor berbasis keyset diperbaiki saat kursor dibuka. Kursor berbasis set kunci dikontrol oleh sekumpulan pengidentifikasi unik, atau kunci, yang dikenal sebagai set kunci. Kunci dibangun dari sekumpulan kolom yang secara unik mengidentifikasi baris dalam tataan hasil. Set kunci adalah kumpulan nilai kunci dari semua baris yang memenuhi syarat untuk SELECT pernyataan pada saat kursor dibuka. Set kunci untuk kursor berbasis keyset dibangun saat tempdb kursor dibuka.

Dinamis

Kursor dinamis adalah kebalikan dari kursor statis. Kursor dinamis mencerminkan semua perubahan yang dibuat pada baris dalam tataan hasilnya saat menggulir kursor. Nilai data, urutan, dan keanggotaan baris dalam kumpulan hasil dapat berubah pada setiap pengambilan. Semua UPDATEpernyataan , INSERT, dan DELETE yang dibuat oleh semua pengguna terlihat melalui kursor. Pembaruan akan segera terlihat jika dibuat melalui kursor menggunakan fungsi API seperti SQLSetPos atau klausa Transact-SQL WHERE CURRENT OF . Pembaruan yang dibuat di luar kursor tidak terlihat sampai dilakukan, kecuali tingkat isolasi transaksi kursor diatur untuk membaca yang tidak dikomit. Untuk informasi selengkapnya tentang tingkat isolasi, lihat MENGATUR TINGKAT ISOLASI TRANSAKSI (Transact-SQL).

Catatan

Rencana kursor dinamis tidak pernah menggunakan indeks spasial.

Meminta kursor

SQL Server mendukung dua metode untuk meminta kursor:

  • Transact-SQL

    Bahasa Transact-SQL mendukung sintaks untuk menggunakan kursor yang dimodelkan setelah sintaks kursor ISO.

  • Fungsi kursor antarmuka pemrograman aplikasi database (API)

    SQL Server mendukung fungsionalitas kursor API database ini:

    • ADO (Objek Data Microsoft ActiveX)

    • OLE DB

    • ODBC (Konektivitas Database Terbuka)

Aplikasi tidak boleh mencampur kedua metode ini untuk meminta kursor. Aplikasi yang menggunakan API untuk menentukan perilaku kursor kemudian tidak boleh menjalankan pernyataan Transact-SQL DECLARE CURSOR untuk juga meminta kursor Transact-SQL. Aplikasi hanya boleh dijalankan DECLARE CURSOR jika mengatur semua atribut kursor API kembali ke defaultnya.

Jika kursor Transact-SQL atau API tidak diminta, SQL Server default untuk mengembalikan kumpulan hasil lengkap, yang dikenal sebagai tataan hasil default, ke aplikasi.

Proses kursor

Kursor Transact-SQL dan kursor API memiliki sintaks yang berbeda, tetapi proses umum berikut digunakan dengan semua kursor SQL Server:

  1. Kaitkan kursor dengan kumpulan hasil pernyataan Transact-SQL, dan tentukan karakteristik kursor, seperti apakah baris dalam kursor dapat diperbarui.

  2. Jalankan pernyataan Transact-SQL untuk mengisi kursor.

  3. Ambil baris dalam kursor yang ingin Anda lihat. Operasi untuk mengambil satu baris atau satu blok baris dari kursor disebut ambil. Melakukan serangkaian pengambilan untuk mengambil baris dalam arah maju atau mundur disebut menggulir.

  4. Secara opsional, lakukan operasi modifikasi (perbarui atau hapus) pada baris pada posisi saat ini di kursor.

  5. Tutup kursor.