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

SQL Server 游標 (CURSOR) 完整範例:逐行處理跨庫資料同步

     編輯:關於SqlServer

適用場景

  • 需逐行執行複雜邏輯(跨庫、多表、條件分支)
  • 資料量較小(< 1 萬行),集合操作難以表達
  • 維護舊系統、一次性修腳本

標準範本

DECLARE @OldId VARCHAR(50), @CustomerID VARCHAR(50);

DECLARE My_Cursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT CustomerID, OldId FROM Customer WHERE Area = 'bj';  -- 只讀、順向、無捲動

OPEN My_Cursor;
FETCH NEXT FROM My_Cursor INTO @CustomerID, @OldId;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 逐行業務邏輯
    DECLARE @OtherPro VARCHAR(500), @StatusID VARCHAR(200), @UserId VARCHAR(200), @FinalUserId VARCHAR(200);
    
    SELECT @OtherPro = OtherPro, @StatusID = CustomerStatusID, @UserId = UserID
    FROM bjsunmis.dbo.Customer WHERE CustomerID = @OldId;
    
    SELECT @FinalUserId = UserID FROM Users WHERE OldId = @UserId;
    
    INSERT INTO CustomerOtherInfo (CustomerID, OtherPro, CustomerStatusID, UserID)
    VALUES (@CustomerID, @OtherPro, @StatusID, @FinalUserId);
    
    FETCH NEXT FROM My_Cursor INTO @CustomerID, @OldId;
END

CLOSE My_Cursor;
DEALLOCATE My_Cursor;
GO

關鍵選項解析

選項說明建議
LOCAL僅批次/SP 內可見✅ 預設 GLOBAL 易衝突
FAST_FORWARDFORWARD_ONLY + READ_ONLY 優化✅ 只讀順向最快
FORWARD_ONLY僅支援 FETCH NEXT✅ 不需捲動
READ_ONLY不可更新底表✅ 避免鎖升級
STATIC複製結果到 tempdb大資料慎用
KEYSET固定鍵集,資料變動可見中等資料
DYNAMIC即時反映所有變動最慢、鎖最久

⚠️ 避坑指南

  1. 忘記 DEALLOCATE:記憶體洩漏,連線池耗盡
  2. 游標內 COMMIT:隱式事務導致鎖長持有,改用自動提交或外層控制
  3. 大資料量用游標:> 1 萬行必改集合操作(INSERT...SELECT、MERGE、CTE)
  4. 巢狀游標:效能災難,重構為 JOIN/APPLY

集合操作替代範例

-- 原游標邏輯:逐行查詢並插入
-- 改為單一陳述式
INSERT INTO CustomerOtherInfo (CustomerID, OtherPro, CustomerStatusID, UserID)
SELECT c.CustomerID, c2.OtherPro, c2.CustomerStatusID, u.UserID
FROM Customer c
JOIN bjsunmis.dbo.Customer c2 ON c2.CustomerID = c.OldId
JOIN Users u ON u.OldId = c2.UserID
WHERE c.Area = 'bj';

原則:能用單一 SQL 解決的,堅決不用游標。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved