如果发生错误,我可以回滚事务:
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'
是否真的完成了。如果没有,则使用特定的返回码回滚
如果我尝试在@@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
...
此时它始终会回滚,因为@@rowcount
会计算最后一个语句,因此它总是等于0
。
在这种情况下如何检查@@error
和受影响的行数?
答案 0 :(得分:12)
将两者存储到您自己的变量中,然后检查:
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