5

如果出現錯誤,我可以回滾事務:TSQL交易的聲明後,都檢查@@ ERROR和@@ ROWCOUNT

CREATE PROCEDURE [dbo].[MySproc] 
(
    @Param1 [int] 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 
... 

但是,如果有在Table1沒有條目與Col1 = @Param1事務成功提交,這對我不利。我想檢查Col2 = 'something'是否真的完成。如果不是,則使用特定的返回碼回滾。
如果我嘗試後@@error檢查插入@@rowcount檢查,如下所示:

CREATE PROCEDURE [dbo].[MySproc] 
(
    @Param1 [int] 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 

IF @@ROWCOUNT = 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -27 
END 
... 

它總是回滾在這一點上,因爲@@rowcount評估最後的語句,因此它總是等於0

如何在這樣的情況下,同時檢查@@error和行數的影響?

回答

11

同時存儲到一個單一查詢自己的變量,然後檢查:

DECLARE @rc int 
DECLARE @err int 
SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 
SELECT @rc = @@ROWCOUNT,@err = @@ERROR 

IF @err <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 

IF @rc = 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -27 
END 
+0

+1。是的。這是一個經典錯誤。 –