如果发生错误,我可以回滚事务:
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
和受影响的行数?
最佳答案
在单个查询中将两者存储到您自己的变量中,然后检查:
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
关于sql-server - TSQL 事务在语句后检查 @@ERROR 和 @@ROWCOUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13356775/