@@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 值 | 說明 |
|---|---|---|---|
| 1 | UPDATE | 2 | 實際影響列數 |
| 2 | SET @Var = @@ROWCOUNT | 1 | 賦值動作本身算 1 列影響 |
| 3 | IF @@ROWCOUNT = 1 | 0 | IF 判斷重置為 0 |
| 4 | PRINT @@ROWCOUNT | 0 | 上一條 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 行受影響」訊息回傳給客戶端。