Cursor trong SQL Server là một cách giúp các lập trình viên duyệt qua từng dòng của dữ liệu(của các row của table), mỗi lần duyệt qua (còn gọi là fech) nó sẽ đưa giá trị của cột tương ứng với dòng đó ra 1 biến, từ đó ta lấy giá trị biến đó để xử lý câu lệnh sql khác.
Có 1 table NhanVien có các cột
Ma Ten
01 Tran A
02 Tran B
03 Tran C
Bắt đầu code sql:
Khai báo 1 biến cursor:
biến X = Cursor SQL (select * From NhanVien)
* Qua dòng này thì biến X nhận viên 3 dòng dữ liệu
Khai báo biến b_Ma , b_Ten
Lặp tất cả các dòng trong biến X
|Bắt đầu lặp Cursor|
--- Lần 1: lấy được dòng thứ 1 tương ứng Ma=01
------ đưa 01 vào biến b_Ma
------ đưa Tran A vào biến b_Ten
------ ** Tại đây ta có thể sử dụng biến b_Ma, b_Ten để xử lý chẵng hạn như Update, Insert, Delete
--- Lần 2: lấy được dòng thứ 1 tương ứng Ma=02
------ đưa 02 vào biến b_Ma
------ đưa Tran B vào biến b_Ten
------ ** Tại đây ta có thể sử dụng biến b_Ma, b_Ten để xử lý chẵng hạn như Update, Insert, Delete
--- Lần 3: lấy được dòng thứ 1 tương ứng Ma=02
------ đưa 02 vào biến b_Ma
------ đưa Tran B vào biến b_Ten
------ ** Tại đây ta có thể sử dụng biến b_Ma, b_Ten để xử lý chẵng hạn như Update, Insert, Delete
|Kết thúc lặp Cursor|
Cursor SQL chỉ đơn là để lấy nội dung ra vòng lặp để xử lý, ngoài ra còn có Cursor SQL lồng Cursor SQL,mình sẽ cập nhật tiếp theo.
Mình chuyển bài mô hình trên thành lệnh SQL Cursor trong SQL thực tế:
Declare @b_Ma nvarchar(50)
Declare @b_Ten nvarchar(50)
DECLARE X CURSOR FOR
SELECT Ma,Ten
FROM NhanVien
OPEN X
FETCH NEXT FROM X
INTO @b_Ma,@b_Ten
WHILE @@FETCH_STATUS = 0
BEGIN
print ' Ma: ' + @b_Ma
FETCH NEXT FROM X
INTO @b_Ma,@b_Ten
END
CLOSE X;
DEALLOCATE X;
Khi làm cursor sql server bạn có thể copy đoạn code dưới và sửa lại theo yêu cầu bài toán nha
Declare @Cot1 nvarchar(50)
Declare @Cot2 nvarchar(50)
DECLARE Ten_cursor CURSOR FOR
SELECT Cot1,Cot2
FROM TenTable
WHERE ...
OPEN Ten_cursor
FETCH NEXT FROM Ten_cursor
INTO @Cot1,@Cot2
WHILE @@FETCH_STATUS = 0
BEGIN
print ' ' + CAST(@Cot1 as varchar(50))
FETCH NEXT FROM Ten_cursor
INTO @Cot1,@Cot2
END
CLOSE Ten_cursor ;
DEALLOCATE Ten_cursor ;
Mẫu 01: SQL có tạo key, và insert
Declare @_SYS_KEY nvarchar(50)
Declare @LoaiChungTu nvarchar(10)
Declare @NumOrder int
Declare @Ma nvarchar(50)
Declare @GiaTri nvarchar(250)
Declare @GiaTri_2 nvarchar(150)
Declare @GiaTri_3 nvarchar(150)
Declare @_key_sys_CRE nvarchar(50)
DECLARE X CURSOR FOR
SELECT _SYS_KEY,LoaiChungTu,NumOrder,Ma,GiaTri,GiaTri_2,GiaTri_3
FROM tbChungTu_Loai_CauHinh Where LoaiChungTu=@LoaiChungTu_Find
OPEN X
FETCH NEXT FROM X
INTO @_SYS_KEY,@LoaiChungTu,@NumOrder,@Ma,@GiaTri,@GiaTri_2,@GiaTri_3
WHILE @@FETCH_STATUS = 0
BEGIN
print ' Ma: ' + @_SYS_KEY
IF NOT EXISTS (SELECT * FROM tbChungTu_Loai_CauHinh WHERE LoaiChungTu=@LoaiChungTu_KhoiTao AND Ma=@Ma)
BEGIN
Set @_key_sys_CRE=LOWER( NEWID() )
Insert into tbChungTu_Loai_CauHinh(_SYS_KEY,LoaiChungTu,NumOrder,Ma,GiaTri,GiaTri_2,GiaTri_3)
Values( @_key_sys_CRE,@LoaiChungTu,@NumOrder,@Ma,@GiaTri,@GiaTri_2,@GiaTri_3)
--
END
FETCH NEXT FROM X
INTO @_SYS_KEY,@LoaiChungTu,@NumOrder,@Ma,@GiaTri,@GiaTri_2,@GiaTri_3
END
CLOSE X;
DEALLOCATE X;
USE [HoSo]
GO
/****** Object: StoredProcedure [dbo].[vdCursor2] Script Date: 05/04/2023 20:35:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
-- [dbo].[vdCursor3]
ALTER PROCEDURE [dbo].[vdCursor3]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Declare @Lop nvarchar(50)
Declare @TenLop nvarchar(50)
Declare @Child_ID int
Declare @Child_Ten nvarchar(50)
Declare @Child_Lop nvarchar(50)
Declare @Child_Diem int
DECLARE Lop_cursor CURSOR FOR
SELECT Lop,TenLop
FROM tbLop
OPEN Lop_cursor
FETCH NEXT FROM Lop_cursor
INTO @Lop, @TenLop
WHILE @@FETCH_STATUS = 0
BEGIN
print ' ' + CAST(@TenLop as varchar(50))
--print ' ' + @Diem
-- Start CHILD CURSOR
DECLARE HoSo_cursor CURSOR FOR
SELECT ID,Ten,Lop,Diem
FROM tbHoSo Where Lop=@Lop
OPEN HoSo_cursor
FETCH NEXT FROM HoSo_cursor
INTO @Child_ID, @Child_Ten,@Child_Lop,@Child_Diem
WHILE @@FETCH_STATUS = 0
BEGIN
print ' -' + CAST(@Child_Ten as varchar(50))
--print ' ' + @Diem
--
--
FETCH NEXT FROM HoSo_cursor
INTO @Child_ID, @Child_Ten,@Child_Lop,@Child_Diem
END
CLOSE HoSo_cursor ;
DEALLOCATE HoSo_cursor ;
-- End CURSOR CHILD
FETCH NEXT FROM Lop_cursor
INTO @Lop, @TenLop
END
CLOSE Lop_cursor ;
DEALLOCATE Lop_cursor ;
END
Cách sử dụng cursor trong SQL Server (cursor sql server).