首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

MSSQL 遊標批量更新符合條件記錄實戰範例

     編輯:SQL Server 2005

應用場景

專案剛上線時各項目票數為零,為展現一定人氣需為每個項目隨機賦予初始票數,且數值不可相同以免被察覺。使用遊標逐行處理可靈活控制每筆記錄的更新邏輯。

範例一:帶條件判斷的遊標更新

DECLARE @Id VARCHAR(50);
DECLARE My_Cursor CURSOR
FOR SELECT Id FROM dbo.kinpanAwardProject WHERE session = 9;

OPEN My_Cursor;
FETCH NEXT FROM My_Cursor INTO @Id;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @Id; -- 除錯用,可移除
    UPDATE dbo.kinpanAwardProject
    SET ProTicketCount = CAST(FLOOR(RAND() * 30) AS INT) + 40
    WHERE Id = @Id;

    FETCH NEXT FROM My_Cursor INTO @Id;
END

CLOSE My_Cursor;
DEALLOCATE My_Cursor;
GO

關鍵點: 使用 RAND() 產生 40~69 之間的隨機整數,配合 WHERE Id = @Id 精確定位單筆記錄更新。

範例二:利用 WHERE CURRENT OF 直接操作遊標當前行

DECLARE My_Cursor CURSOR
FOR SELECT * FROM dbo.MemberAccount;

OPEN My_Cursor;
FETCH NEXT FROM My_Cursor;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor;
    -- DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor;

    FETCH NEXT FROM My_Cursor;
END

CLOSE My_Cursor;
DEALLOCATE My_Cursor;
GO

優勢: 無需額外宣告變數接收主鍵,亦無需撰寫 WHERE 條件,直接對遊標當前行操作,程式碼更簡潔、效能略佳。適用於不需複雜條件判斷、單純遍歷更新/刪除的場景。

遊標使用建議

  • 遊標屬逐行處理,大數據量時效能較差,優先考慮集合操作(如單一 UPDATE 配合 CASE WHEN)。
  • 務必成對使用 CLOSE 與 DEALLOCATE 釋放資源,避免記憶體洩漏。
  • FAST_FORWARD、READ_ONLY 等選項可進一步優化唯讀、單向遊標的效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved