Tạo con trỏ (cursor) sql server

Cách sử dụng cursor trong SQL Server (cursor sql server).

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.


  1. Ví dụ theo kiểu không bàn về CODE, chỉ trình bày dạng mô hình xử lý
  2. Ví dụ SQL Cursor trong SQL thực tế
  3. Mẫu ví dụ Cursor với table SQL
  4. Ví dụ Cursor lồng Cursor table SQL Server
     

1 . Ví dụ theo kiểu không bàn về CODE, chỉ trình bày dạng mô hình xử lý
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_Mab_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_Mab_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_Mab_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.


2. Ví dụ SQL Cursor trong SQL thực tế
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;

 


3. Mẫu ví dụ Cursor với table SQL

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 ;

 

4. Ví dụ Cursor lồng Cursor table SQL Server

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