在语句之后,TSQL事务检查@@ ERROR和@@ ROWCOUNT

rem*_*rem 8 t-sql sql-server error-handling stored-procedures transactions

如果发生错误,我可以回滚事务:

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
...
Run Code Online (Sandbox Code Playgroud)

但是,如果没有条目在Table1Col1 = @Param1事务成功提交,这是对我不好.我想检查一下是否Col2 = 'something'真的完成了.如果没有,则使用特定的返回码回滚.
如果我在@@rowcount检查后尝试插入@@error检查,如下所示:

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
...
Run Code Online (Sandbox Code Playgroud)

它总是在这一点上回滚,因为它会@@rowcount计算最后一个语句,所以它总是等于0.

如何在这种情况下检查@@error受影响的行数和行数?

Dam*_*ver 14

在一个查询中将它们存储到您自己的变量中,然后检查:

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
Run Code Online (Sandbox Code Playgroud)