萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server @@ROWCOUNT 全局變量深度解析:每語句重置特性與正確使用姿勢

核心特性

  • 返回**上一條 T-SQL 語句影響的行數**
  • 每條語句執行後自動重置(含 SET、IF、PRINT 等)
  • 不返回行的語句(DDL、變量賦值、流程控制)將其置 0
  • 類似 @@ERROR,屬語句級上下文變量

經典陷阱演示


DECLARE @RowCountVar INT;

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

SET @RowCountVar = @@ROWCOUNT;  -- 賦值語句本身影響 1 行
-- 此時 @@ROWCOUNT = 1 !已被重置

IF @@ROWCOUNT = 1  -- 判斷的是 SET 語句的影響行數,而非 UPDATE
BEGIN
    PRINT '影響的行數為 1';
    PRINT @@ROWCOUNT;  -- 輸出 0(PRINT 後重置)
END

IF @RowCountVar <> 0  -- 正確:使用保存的局部變量
BEGIN
    PRINT '受影響的行數為:' + STR(@RowCountVar);  -- 輸出 2
END

輸出結果


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

最佳實踐模式


-- 1. 緊跟目標語句立即保存
UPDATE tbl SET col = val WHERE id = @id;
DECLARE @affected INT = @@ROWCOUNT;  -- 同一批次或緊鄰語句

-- 2. 邏輯判斷用局部變量
IF @affected = 0
BEGIN
    RAISERROR('無數據更新', 16, 1);
    RETURN;
END

-- 3. 多語句事務中每條關鍵操作後保存
BEGIN TRAN;
INSERT ...; SET @ins = @@ROWCOUNT;
UPDATE ...; SET @upd = @@ROWCOUNT;
DELETE ...; SET @del = @@ROWCOUNT;
COMMIT;

-- 4. 觸發器中判斷操作類型
CREATE TRIGGER tr_tbl ON tbl AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    IF @@ROWCOUNT = 0 RETURN;
    IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
        PRINT 'UPDATE';
    ELSE IF EXISTS(SELECT * FROM inserted)
        PRINT 'INSERT';
    ELSE
        PRINT 'DELETE';
END

對比:@@ROWCOUNT vs ROWCOUNT_BIG()

特性@@ROWCOUNTROWCOUNT_BIG()
返回類型INT (最大 21 億)BIGINT (922 兆)
適用場景常規 DML大批量操作(>21 億行)
重置行為同同

常見誤區

  1. 以為 IF 不重置 @@ROWCOUNT:任何語句包括 IF/WHILE/PRINT/SET 都會重置
  2. 跨批次引用:GO 批次分隔符後 @@ROWCOUNT 歸 0
  3. 動態 SQL 中引用:EXEC(@sql); SELECT @@ROWCOUNT 返回 EXEC 本身影響行數(通常 0),而非動態 SQL 內部行數 → 需在動態 SQL 內部用 OUTPUT 參數返回
copyright © 萬盛學電腦網 all rights reserved