Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara menggunakan Kursor SQL untuk Keperluan Khusus

Artikel ini menjelaskan kursor SQL dan cara menggunakannya untuk beberapa tujuan khusus. Ini menyoroti pentingnya kursor SQL beserta kelemahannya.

Anda tidak selalu menggunakan kursor SQL dalam pemrograman database, tetapi pemahaman konseptual mereka dan mempelajari cara menggunakannya sangat membantu untuk memahami cara melakukan tugas luar biasa dalam pemrograman T-SQL.

Ikhtisar Kursor SQL

Mari kita membahas beberapa dasar kursor SQL jika Anda tidak terbiasa dengannya.

Definisi Sederhana

Kursor SQL menyediakan akses ke data satu baris pada satu waktu sehingga memberi Anda lebih banyak kontrol (baris demi baris) atas kumpulan hasil.

Definisi Microsoft

Menurut dokumentasi Microsoft, pernyataan Microsoft SQL Server menghasilkan kumpulan hasil yang lengkap, tetapi ada kalanya hasil paling baik diproses satu baris dalam satu waktu. Membuka kursor pada kumpulan hasil memungkinkan pemrosesan kumpulan hasil satu baris dalam satu waktu.

T-SQL dan Kumpulan Hasil

Karena definisi sederhana dan Microsoft dari kursor SQL menyebutkan kumpulan hasil, mari kita coba memahami apa sebenarnya kumpulan hasil dalam konteks pemrograman basis data. Mari kita cepat membuat dan mengisi tabel Siswa dalam database sampel UniversityV3 sebagai berikut:

BUAT TABEL [dbo].[Student] ( [StudentId] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (30) NULL, [Course] VARCHAR (30) NULL, [Marks] INT NULL, [ExamDate] DATETIME2 (7) NULL, CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC));-- (5) Mengisi tabel StudentSET IDENTITY_INSERT [dbo].[Student] ONINSERT INTO [dbo].[Student] ( [Id Mahasiswa], [Nama], [Kursus], [Nilai], [Tanggal Ujian]) NILAI (1, N'Asif', N'Sistem Manajemen Basis Data', 80, N'01-01-01 00:00:00 ')INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) NILAI (2, N'Peter', N'Database Management System', 85, N'2016-01-01 00:00:00')INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) NILAI (3, N' Sam', N'Database Management System', 85, N'2016-01-01 00:00:00')INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks ], [ExamDate]) NILAI (4, N'Adil', N'Database Management System', 85, N'2016-01-01 00:00:00 ')INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) NILAI (5, N'Naveed', N'Database Management System', 90, N'2016-01-01 00:00:00')SET IDENTITY_INSERT [dbo].[Student] OFF

Sekarang, pilih semua baris dari Siswa tabel:

-- Melihat data tabel SiswaPILIH [Id Siswa], [Nama], [Kursus], [Nilai], [Tanggal Ujian] FROM dbo.Siswa

Ini adalah kumpulan hasil yang dikembalikan sebagai hasil dari pemilihan semua catatan dari Siswa tabel.

T-SQL dan Teori Himpunan

T-SQL murni berdasarkan dua konsep matematika berikut:

  1. Teori Himpunan
  2. Logika Predikat

Teori himpunan, seperti namanya, adalah cabang matematika tentang himpunan yang juga bisa disebut kumpulan objek-objek tertentu yang berbeda.

Singkatnya, dalam teori himpunan, kita memikirkan sesuatu atau objek secara keseluruhan dengan cara yang sama seperti kita memikirkan item individual.

Misalnya, siswa adalah himpunan semua siswa yang berbeda pasti, jadi, kita mengambil siswa secara keseluruhan yang cukup untuk mendapatkan rincian semua siswa dalam himpunan itu (tabel).

Silakan merujuk ke artikel saya The Art of Aggregating Data in SQL from Simple to Sliding Aggregations untuk detail lebih lanjut.

Cursor dan Operasi Berbasis Baris

T-SQL terutama dirancang untuk melakukan operasi berbasis set seperti memilih semua catatan dari tabel atau menghapus semua baris dari tabel.

Singkatnya, T-SQL dirancang khusus untuk bekerja dengan tabel dalam mode berbasis set, yang berarti kita memikirkan tabel secara keseluruhan, dan operasi apa pun seperti pilih, perbarui, atau hapus diterapkan secara keseluruhan ke tabel atau tertentu. baris yang memenuhi kriteria.

Namun, ada kasus ketika tabel perlu diakses baris demi baris daripada sebagai satu kumpulan hasil tunggal, dan inilah saatnya kursor beraksi.

Menurut Vaidehi Pandere, terkadang logika aplikasi perlu bekerja dengan satu baris pada satu waktu daripada semua baris sekaligus yang sama dengan looping (penggunaan loop untuk iterasi) melalui seluruh kumpulan hasil.

Dasar-dasar Kursor SQL dengan Contoh

Sekarang mari kita bahas lebih lanjut tentang kursor SQL.

Pertama-tama, mari kita pelajari atau tinjau (yang sudah terbiasa menggunakan kursor di T-SQL) cara menggunakan kursor di T-SQL.

Menggunakan kursor SQL adalah proses lima langkah yang dinyatakan sebagai berikut:

  1. Deklarasikan Kursor
  2. Buka Kursor
  3. Ambil baris
  4. Tutup Kursor
  5. Alokasikan Kursor

Langkah 1:Deklarasikan Kursor

Langkah pertama adalah mendeklarasikan kursor SQL agar dapat digunakan setelahnya.

Kursor SQL dapat dideklarasikan sebagai berikut:

DECLARE Cursor  untuk 

Langkah 2:Buka Kursor

Langkah selanjutnya setelah deklarasi adalah membuka kursor yang berarti mengisi kursor dengan set hasil yang dinyatakan sebagai berikut:

Buka 

Langkah 3:Ambil Baris

Setelah kursor dideklarasikan dan dibuka, langkah selanjutnya adalah mulai mengambil baris dari kursor SQL satu per satu sehingga mengambil baris mendapatkan baris berikutnya yang tersedia dari kursor SQL:

Ambil Berikutnya dari 

Langkah 4:Tutup Kursor

Setelah baris diambil satu per satu dan dimanipulasi sesuai kebutuhan, langkah selanjutnya adalah menutup kursor SQL.

Menutup kursor SQL melakukan tiga tugas:

  1. Melepaskan kumpulan hasil yang saat ini dipegang oleh kursor
  2. Membebaskan semua kunci kursor pada baris oleh kursor
  3. Menutup kursor yang terbuka

Sintaks sederhana untuk menutup kursor adalah sebagai berikut:

Tutup 

Langkah 5:Dealokasi Kursor

Langkah terakhir dalam hal ini adalah membatalkan alokasi kursor yang menghilangkan referensi kursor.

Sintaksnya adalah sebagai berikut:

DEALLOCATE 

Kompatibilitas Kursor SQL

Menurut dokumentasi Microsoft, kursor SQL kompatibel dengan versi berikut:

  1. SQL Server 2008 dan versi lebih tinggi
  2. Database SQL Azure

Contoh Kursor SQL 1:

Sekarang kita sudah familiar dengan langkah-langkah yang terlibat untuk mengimplementasikan kursor SQL, mari kita lihat contoh sederhana menggunakan kursor SQL:

-- Deklarasikan contoh kursor Mahasiswa 1GUNAKAN UniversitasV3GODECLARE Student_Cursor CURSOR FOR SELECT StudentId ,[Name]FROM dbo.Student;OPEN Student_CursorFETCH NEXT FROM Student_CursorWHILE @@FETCH_STATUS =0BEGINFETCH NEXTurStudentsorCLOSEurStudentsorCLOSEurs Student FROMEND_CursorCursorCursorCursorCursorCursor. 

Outputnya adalah sebagai berikut:

Contoh Kursor SQL 2:

Dalam contoh ini, kita akan menggunakan dua variabel untuk menyimpan data yang dipegang oleh kursor saat bergerak dari baris ke baris sehingga kita dapat menampilkan hasil yang ditetapkan satu baris pada satu waktu dengan menampilkan nilai variabel.

-- Deklarasikan kursor Mahasiswa dengan contoh variabel 2USE UniversityV3GODECLARE @StudentId INT ,@StudentName VARCHAR(40) -- Deklarasikan variabel untuk menampung data baris yang dipegang kursorDECLARE Student_Cursor KURSOR UNTUK SELECT StudentId ,[Name]FROM dbo.Student;OPEN Student_C NEXT FROM Student_Cursor INTO @StudentId, @StudentName -- Ambil baris pertama dan simpan ke dalam variabelWHILE @@FETCH_STATUS =0BEGINPRINT CONCAT(@StudentId,'--', @StudentName) -- Tampilkan data variabelFETCH NEXT FROM Student_Cursor -- Dapatkan baris berikutnya data ke dalam kursor dan simpan ke dalam variabelINTO @StudentId, @StudentNameENDCLOSE Student_Cursor -- Tutup kunci kursor pada barisDEALLOCATE Student_Cursor -- Lepaskan referensi kursor

Hasil dari kode SQL di atas adalah sebagai berikut:

Orang akan berpendapat bahwa kita dapat mencapai hasil yang sama dengan menggunakan skrip SQL sederhana sebagai berikut:

-- Melihat ID dan nama siswa tanpa kursor SQLSELECT StudentId,Name FROM dbo.Studentorder by StudentId

Faktanya, ada beberapa tugas yang memerlukan kursor SQL untuk digunakan meskipun faktanya kursor SQL tidak disarankan karena berdampak langsung pada memori.

Catatan Penting

Harap diingat bahwa menurut Vaidehi Pandere, kursor adalah kumpulan pointer yang menempati memori sehingga menempati memori sistem Anda yang seharusnya digunakan oleh proses penting lainnya; itulah mengapa melintasi hasil besar yang disetel melalui kursor bukanlah ide yang baik kecuali ada alasan yang sah untuk itu.

Menggunakan Kursor SQL untuk Tujuan Khusus

Kita akan membahas beberapa tujuan khusus di mana kursor SQL dapat digunakan.

Pengujian Memori Server Basis Data

Karena kursor SQL memiliki dampak yang tinggi pada memori sistem, mereka adalah kandidat yang baik untuk mereplikasi skenario di mana penggunaan memori yang berlebihan oleh prosedur tersimpan yang berbeda atau skrip SQL ad-hoc perlu diselidiki.

Salah satu cara sederhana untuk memahami ini adalah dengan mengklik tombol statistik klien pada bilah alat (atau tekan Shift+Alt+S) di SSMS (SQL Server Management Studio) dan jalankan kueri sederhana tanpa kursor:

Sekarang jalankan kueri dengan kursor menggunakan variabel (Contoh Kursor SQL 2):

Sekarang tolong catat perbedaannya:

Jumlah pernyataan SELECT tanpa kursor:1

Jumlah pernyataan SELECT dengan kursor:7

Jumlah bolak-balik server tanpa kursor:1

Jumlah server bolak-balik dengan kursor:2

Waktu pemrosesan klien tanpa kursor:1

Waktu pemrosesan klien dengan kursor:8

Total waktu eksekusi tanpa kursor:1

Total waktu eksekusi dengan kursor:38

Waktu tunggu pada balasan server tanpa kursor:0

Waktu tunggu pada balasan server dengan kursor:30

Singkatnya, menjalankan kueri tanpa kursor yang mengembalikan hanya 5 baris berarti menjalankan kueri yang sama 6-7 kali dengan kursor.

Sekarang Anda dapat membayangkan betapa mudahnya mereplikasi dampak memori menggunakan kursor, namun, ini tidak selalu merupakan hal terbaik untuk dilakukan.

Tugas Manipulasi Objek Basis Data Massal

Ada area lain di mana kursor SQL dapat berguna dan saat itulah kita harus melakukan operasi massal pada database atau objek database.

Untuk memahami ini, pertama, kita perlu membuat tabel Kursus dan mengisinya di UniversityV3 database sebagai berikut:

-- Buat tabel KursusCREATE TABLE [dbo].[Course] ( [CourseId] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (30) NOT NULL, [Detail] VARCHAR (200) NULL, CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([CourseId] ASC));-- Mengisi tabel KursusSET IDENTITY_INSERT [dbo].[Course] ONINSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) NILAI (1, N'DevOps for Databases', N'This is about DevOps for Databases')INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) NILAI (2, N'Power BI Fundamentals', N'Ini tentang Power BI Fundamentals')INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) NILAI (3, N'T-SQL Programming', N'About Pemrograman T-SQL')INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) NILAI (4, N'Tabular Data Modeling', N'This is about Tabular Data Modeling')INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) NILAI (5, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals')SET IDENTITY_INSERT [dbo].[Kursus] MATI

Sekarang misalkan kita ingin mengganti nama semua tabel yang ada di UniversityV3 database sebagai tabel LAMA.

Ini membutuhkan iterasi kursor pada semua tabel satu per satu sehingga mereka dapat diganti namanya.

Kode berikut berfungsi:

-- Deklarasikan kursor Student untuk mengganti nama semua tabel menjadi oldUSE UniversityV3GODECLARE @TableName VARCHAR(50) -- Nama tabel yang ada ,@NewTableName VARCHAR(50) -- Nama tabel baruDECLARE Student_Cursor CURSOR FOR SELECT T.TABLE_NAME FROM INFORMABLE_SCHEMA. T;OPEN Student_CursorFETCH NEXT FROM Student_Cursor INTO @TableNameWHILE @@FETCH_STATUS =0BEGINSET @[email protected]+'_OLD' -- Tambahkan _OLD ke nama tabel yang sudah adaEXEC sp_rename @TableName,@NewTableName -- Ganti nama tabel menjadi NEOLD tabel FROMTCH -- Masukkan data baris berikutnya ke dalam kursor dan simpan ke dalam variabelINTO @TableNameENDCLOSE Student_Cursor -- Tutup kunci kursor pada barisDEALLOCATE Student_Cursor -- Lepaskan referensi kursor

Selamat, Anda telah berhasil mengganti nama semua tabel yang ada menggunakan kursor SQL.

Hal yang Dapat Dilakukan

Sekarang setelah Anda terbiasa dengan penggunaan kursor SQL, silakan coba hal-hal berikut:

  1. Cobalah untuk membuat dan mengganti nama indeks dari semua tabel dari database sampel melalui kursor.
  2. Coba kembalikan tabel yang diganti namanya dalam artikel ini kembali ke nama aslinya menggunakan kursor.
  3. Silakan coba isi tabel dengan banyak baris dan ukur statistik dan waktu untuk kueri dengan dan tanpa kursor.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memesan Secara Abjad dalam SQL

  2. Bagaimana Desain Basis Data Membantu Mengatur Guru, Pelajaran, dan Siswa?

  3. FrankenQueries:ketika SQL dan NoSQL bertabrakan

  4. Salesforce SOQL dari Windows PowerShell

  5. Menambahkan Lebih Banyak Penyimpanan Data ke Microsoft Power BI