DECLARE @id INT, @name VARCHAR(50);
DECLARE cursor1 CURSOR FOR
SELECT id, name FROM table1; -- 依需求撰寫 SELECT
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @id, @name;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 處理邏輯,例如更新
UPDATE table1 SET name = name + '1' WHERE id = @id;
FETCH NEXT FROM cursor1 INTO @id, @name;
END
CLOSE cursor1;
DEALLOCATE cursor1;
| 值 | 含義 |
|---|---|
| 0 | FETCH 成功 |
| -1 | 失敗或超出結果集 |
| -2 | 擷取的列已不存在 (如被刪除) |
CREATE TABLE #Temp1 (deptid INT, userid INT, username VARCHAR(20));
CREATE TABLE #Temp2 (deptid INT, username VARCHAR(20));
INSERT INTO #Temp1 VALUES
(1,100,'a'),(1,101,'b'),(1,131,'d'),(1,201,'f'),
(2,302,'c'),(2,202,'a'),(2,221,'e'),
(3,102,'y'),(3,302,'e'),(3,121,'t');
DECLARE @deptid INT, @username VARCHAR(20);
DECLARE c CURSOR FOR SELECT deptid, username FROM #Temp1;
OPEN c;
FETCH NEXT FROM c INTO @deptid, @username;
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT 1 FROM #Temp2 WHERE deptid = @deptid)
UPDATE #Temp2 SET username = username + @username WHERE deptid = @deptid;
ELSE
INSERT INTO #Temp2 VALUES (@deptid, @username);
FETCH NEXT FROM c INTO @deptid, @username;
END
CLOSE c; DEALLOCATE c;
SELECT * FROM #Temp2;
/* 結果:
deptid username
1 abd f
2 cae
3 yet
*/
DROP TABLE #Temp1, #Temp2;
DECLARE c CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY -- 預設效能最佳
FOR SELECT ...;
LOCAL:批次結束自動釋放。STATIC:建立結果集複本,不反映後續變更。READ_ONLY:不可透過游標更新。FORWARD_ONLY:僅支援 FETCH NEXT,效能最好。STRING_AGG (SQL 2017+)、FOR XML PATH、STUFF + XML 合併字串。掌握游標語法是基本功,但**生產環境請以集合思維優先**,游標為最後手段。