首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server @@ROWCOUNT 全域變數深度解析與避坑指南

     編輯:MySQL 資料庫相關知識

@@ROWCOUNT 回傳上一條 T-SQL 陳述式影響的資料列數。其行為類似 @@ERROR:**每條陳述式執行後即重置**,若需後續使用,必須立即存入區域變數。本文透過實測代碼揭示其在 IF、賦值等情境下的重置陷阱。

核心特性

  • 僅反映緊鄰前一條陳述式的影響列數。
  • 任何不回傳列數的陳述式(如 IF、SET、PRINT、DECLARE)會將其重置為 0。
  • 不受隱式交易、觸發器巢狀影響,但會被 TRY...CATCH 區塊隔離。

實測代碼與輸出分析

DECLARE @RowCountVar INT;

UPDATE AF_CarOil SET OilType = '五號汽油';  -- 假設影響 2 列
-- 此時 @@ROWCOUNT = 2

SET @RowCountVar = @@ROWCOUNT;               -- 賦值陳述式本身影響 1 列
-- 此時 @@ROWCOUNT = 1  (已被重置!)

IF @@ROWCOUNT = 1                            -- IF 判斷陳述式不影響列
BEGIN
    PRINT '影響的行數為 1';
    PRINT @@ROWCOUNT;                        -- 輸出 0
END

IF @RowCountVar <> 0
BEGIN
    PRINT '受影響的行數為:' + STR(@RowCountVar);  -- 輸出 2
END

輸出結果

(2 行受影響)
影響的行數為 1
0
受影響的行數為: 2

關鍵時間點圖解

步驟陳述式@@ROWCOUNT 值說明
1UPDATE2實際影響列數
2SET @Var = @@ROWCOUNT1賦值動作本身算 1 列影響
3IF @@ROWCOUNT = 10IF 判斷重置為 0
4PRINT @@ROWCOUNT0上一條 PRINT 重置為 0

最佳實踐模式

-- 正確模式:緊接著存入變數
UPDATE dbo.Orders SET Status = 1 WHERE Id = @Id;
DECLARE @Affected INT = @@ROWCOUNT;  -- 立即捕獲

IF @Affected = 0
    THROW 50001, '訂單不存在', 1;
ELSE IF @Affected > 1
    THROW 50002, '異常:單鍵更新影響多列', 1;

-- 後續邏輯安全使用 @Affected

常見錯誤場景

  • IF @@ROWCOUNT > 0 BEGIN ... END 後直接再用 @@ROWCOUNT → 已歸零。
  • 在觸發器中未立即保存,外層呼叫端讀到的是觸發器最後一條陳述式的計數。
  • 合併 MERGE 陳述式時,@@ROWCOUNT 反映合併總影響列數(含 INSERT/UPDATE/DELETE),需配合 OUTPUT 子句細分。

版本差異提示

SQL Server 2005 起行為一致。Azure SQL Database、Azure Synapse 亦相同。若使用 SET NOCOUNT ON,@@ROWCOUNT 仍正常更新,僅抑制「n 行受影響」訊息回傳給客戶端。

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