Trong SQL Server, Cursor (con trỏ) là một cơ chế cho phép bạn xử lý từng dòng dữ liệu trong tập kết quả của một câu truy vấn SQL.
Khác với cách xử lý theo lô (set-based), cursor cho phép thao tác từng hàng dữ liệu một cách tuần tự, rất phù hợp trong những trường hợp cần thao tác phức tạp với từng dòng.
Khi nào cần dùng Cursor?
Khi làm việc với dữ liệu trong SQL Server, ngoài các câu lệnh cơ bản như SELECT, INSERT, UPDATE, DELETE để thao tác dữ liệu chúng ta sẽ còn rất nhiều chức năng khác hiếm nghe nghe đến và sử dụng.
Một trong số đó là lặp đi lặp lại từng dòng dữ liệu hoặc một tập dữ liệu cụ thể. Trong SQL, cung cấp “cursor” để giúp chúng ta xử lý và làm việc trong trường hợp này.

Mặc dù SQL là ngôn ngữ xử lý theo tập hợp, nhưng trong thực tế có những trường hợp bạn cần phải thao tác với từng dòng riêng lẻ, chẳng hạn:
-
Cần thực hiện các phép tính hoặc hành động phụ thuộc vào từng dòng dữ liệu.
-
Gửi thông báo cá nhân hóa đến từng người dùng.
-
Cập nhật dữ liệu theo logic phức tạp không thể xử lý trực tiếp bằng
UPDATE
,JOIN
hoặcMERGE
. -
Xử lý luồng dữ liệu trong một vòng lặp hoặc cần gọi thủ tục với từng dòng.
Tuy nhiên, nên nhớ rằng Cursor nên được sử dụng cẩn trọng, vì chúng tiêu tốn tài nguyên và có thể làm chậm hiệu suất hệ thống nếu dùng không đúng cách.
Cú pháp sử dụng Cursor trong SQL Server
Khai báo Cursor

Mở Cursor
Sau đó có thể lặp qua toàn bộ dữ liệu bằng vòng lặp WHILE
:
Đóng và giải phóng Cursor
Ví dụ: Sử dụng Cursor để ghi tổng điểm từng học sinh
Ưu và nhược điểm của Cursor
Ưu điểm
-
Linh hoạt khi xử lý logic phức tạp với từng dòng dữ liệu.
-
Có thể thực hiện nhiều thao tác không thể làm bằng truy vấn SQL thông thường.
-
Thích hợp với các thủ tục cần luồng xử lý tuần tự.

Nhược điểm
-
Cursor có thể gây giảm hiệu suất, đặc biệt với tập dữ liệu lớn.
-
Dễ khiến hệ thống bị chậm nếu không được đóng đúng cách.
-
Mã nguồn trở nên phức tạp, khó bảo trì hơn.
Một số loại Cursor phổ biến trong SQL Server
Loại Cursor | Mô tả |
---|---|
FORWARD_ONLY | Chỉ di chuyển theo hướng tới (mặc định) |
STATIC | Tạo một bản sao tĩnh của dữ liệu, không phản ánh thay đổi sau đó |
KEYSET | Dữ liệu cố định nhưng phản ánh thay đổi dữ liệu |
DYNAMIC | Phản ánh tất cả thay đổi dữ liệu trong quá trình di chuyển con trỏ |
FAST_FORWARD | Cursor nhanh, chỉ đọc và chỉ đi tiến |
Các lưu ý khi dùng Cursor
-
Hạn chế sử dụng trong hệ thống lớn vì ảnh hưởng đến hiệu năng.
-
Luôn nhớ đóng (CLOSE) và giải phóng (DEALLOCATE) để tránh rò rỉ bộ nhớ.
-
Nên xem xét các giải pháp thay thế như:
JOIN
,CTE
,MERGE
,WHILE EXISTS
, bảng tạm (#temp
table), hoặc hàm bảng (table-valued functions
) nếu có thể.
Tổng kết
Cursor trong SQL Server là một công cụ mạnh mẽ để xử lý dữ liệu tuần tự. Tuy nhiên, bạn chỉ nên dùng Cursor khi các phương pháp xử lý tập hợp không thể đáp ứng nhu cầu. Với những hệ thống cần hiệu năng cao, việc sử dụng Cursor cần được đánh giá kỹ và tối ưu hóa phù hợp.