Cursors trong MS SQL Server là gì, cách sử dụng?
Nếu giải thích một cách ngắn gọn thì cursor tương tự như recordset hay dataset trong programming. Nghĩa là ta select một số data vào memory sau đó có thể lần lượt làm việc với từng record bằng cách Move Next...

Có 3 loại cursors là Transact- SQL Cursors, API Cursors và Client Cursors. Trong đó Transact-SQL và API thuộc loại Server Cursors nghĩa là cursors được load lên và làm việc bên phía server. Trong khuôn khổ bài học này ta chỉ nghiên cứu Transact-SQL cursors.

Transact-SQL cursors được tạo ra trên server bằng các câu lệnh Transact-SQL và chủ yếu được dùng trong stored procedures và triggers. Trước hết hãy xem qua một ví dụ về cursor:

               DECLARE @au_lname varchar(40), @au_fname varchar(20)
                DECLARE Employee_Cursor CURSOR FOR 
               SELECT LastName, FirstName FROM Northwind.dbo.Employees 
                OPEN Employee_Cursor 
                FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname 
               WHILE @@FETCH_STATUS = 0 
               BEGIN 
                               PRINT 'Author:' + @au_fname + ' ' + @au_lname
                               FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname
               END
                CLOSE Employee_Cursor
                DEALLOCATE Employee_Cursor 

Trong ví dụ ở trên ta sẽ select LastName và FirstName từ Employees table của Northwind database và load vào Employee_Cursor sau đó lần lượt in tên của các employee ra màn hình. Ðể làm việc với một cursor ta cần theo các bước sau:

1. Dùng câu lệnh DECLARE CURSOR để khai báo một cursor. Khi khai báo ta cũng phải cho biết câu lệnh SELECTsẽ được thực hiện để lấy data.

2. Dùng câu lệnh OPEN để đưa data lên memory (populate data). Ðây chính là lúc thực hiện câu lệnh SELECT vốn được khai báo ở trên.

3. Dùng câu lệnh FETCH để lấy từng hàng data từ record set. Cụ thể là ta phải gọi câu lệnh FETCH nhiều lần. FETCH tương tự như lệnh Move trong ADO recordset ở chỗ nó có thể di chuyển tới lui bằng câu lệnh FETCH FIRST, FETCH NEXT, FETCH PRIOR, FETCH LAST, FETCH ABSOLUTE n, FETCH RELATIVE n nhưng khác ở chỗ là nó lấy data bỏ vào trong variable (FETCH...FROM...INTO variable_name). Thông thường ta FETCH data trước sau đó loop cho tới record cuối của Cursor bằng vòng lặp WHILE bằng cách kiểm tra global variable @@FETCH_STATUS (=0 nghĩa là thành công).

4. Khi ta viếng thăm từng record ta có thể UPDATE hay DELETE tùy theo nhu cầu (trong thí dụ này chỉ dùng lệnh PRINT)

5. Dùng câu lệnh CLOSE để đóng cursor. Một số tài nguyên (memory resource) sẽ được giải phóng nhưng cursor vẫn còn được khai báo và có thể OPEN trở lại.

6. Dùng câu lệnh DEALLOCATE để phóng thích hoàn toàn các tài nguyên dành cho cursor (kể cả tên của cursor).

Lưu ý là trong ví dụ ở trên trước khi dùng Cursor ta cũng declare một số variable (@au_fname và @au_lname) để chứa các giá trị lấy được từ cursor. Bạn có thể dùng Query Analyzer để chạy thử ví dụ trên.

 

Bài viết cùng danh mục

Đừng để bản thân luôn sống trong sự sợ hãi
Chia sẻ Trong cuộc sống thường nhật, chúng ta có hàng trăm ngàn thứ để sợ, nhưng thực ra không nên gộp tất cả thành một vì không phải nỗi sợ nào cũng không tốt. Nhìn chung, ta có thể phần nào phân loại nỗi sợ theo hai dạng: nỗi sợ bản năng và nỗi sợ tâm lý.
5 bí quyết để tập trung cao độ trong công việc
Chia sẻ Sự tập trung cao độ sẽ là chìa khóa giúp bạn vượt qua những cám dỗ và đạt được các mục tiêu trong công việc. Hiệu suất làm việc tăng đồng nghĩa với việc bạn sẽ có thêm thời gian đầu tư cho việc phát triển sự nghiệp. Tuy nhiên, không phải lúc nào bạn cũng có được sự tập trung cần thiết. Vậy làm cách nào để có thể tập trung tối đa?
Nằm bên người đẹp mà vẫn lạnh
Chia sẻ Một đêm tối trời ở một làng quê hẻo lánh, một khách bộ hành nhỡ độ đường ghé vào một căn nhà xin thuê phòng nghỉ qua đêm. Chủ nhà từ chối vì nhà chỉ có hai phòng, một của hai vợ chồng và một của cô con gái...
Hạnh phúc đến từ đâu
Chia sẻ Vị vua nọ đang đi công du trên một chiếc tàu thì gặp cơn bão lớn. Gió to, sóng dữ gầm thét như muốn quật đổ những cột buồm và nuốt chửng con tàu