DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
FOR select_statement
SCROLL DYNAMIC:可任意移動(FETCH FIRST/NEXT/PRIOR/LAST/ABSOLUTE/RELATIVE),支援更新/刪除。FAST_FORWARD:唯讀、僅向前、效能最佳(內部為 FORWARD_ONLY READ_ONLY 優化)。USE DB1;
GO
DECLARE MyCursor CURSOR SCROLL DYNAMIC
FOR SELECT Name FROM PersonalInfo;
DECLARE @Name SYSNAME;
OPEN MyCursor;
FETCH NEXT FROM MyCursor INTO @Name;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Name: ' + @Name;
FETCH NEXT FROM MyCursor INTO @Name;
END
-- 示範移動到第一筆
FETCH FIRST FROM MyCursor INTO @Name;
PRINT 'First: ' + @Name;
-- 更新當前資料列(需 DYNAMIC 或 KEYSET)
-- UPDATE PersonalInfo SET Name = 'ZZG' WHERE CURRENT OF MyCursor;
-- 刪除當前資料列
-- DELETE FROM PersonalInfo WHERE CURRENT OF MyCursor;
CLOSE MyCursor;
DEALLOCATE MyCursor;
GO
OPEN / CLOSE、DECLARE / DEALLOCATE。@@FETCH_STATUS:0=成功,-1=失敗/超出範圍,-2=資料列已刪除。WHERE CURRENT OF 只能用於支援更新的游標(DYNAMIC, KEYSET, STATIC 配合 SCROLL_LOCKS 或 OPTIMISTIC)。SET 為基礎的 SQL,游標僅用於必須逐列邏輯(如呼叫外部 API、複雜序列處理)。WHILE 迴圈配合 TOP (1) / ROW_NUMBER()。UPDATE ... FROM 批次處理。善用游標屬性與 FETCH 選項,能精準控制資料列級別的操作流程。