sql-server - TSQL 事务在语句后检查 @@ERROR 和 @@ROWCOUNT

标签 sql-server tsql stored-procedures error-handling 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
...

但是,如果 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/

相关文章:

sql - SQL Server 标识函数是否可重现

sql - GROUP BY 同一列中的多个值

sql-server - 从 Sql Server 2008 执行 Oracle 存储过程

sql - 复杂的MySQL存储过程

sql - 转置数据布局

sql-server - "Invalid column name"抛出到无法访问的脚本 block 内

java - 如何按计划按需执行 Java 任务?

SQL Server 基于行的分组

Python mysql.connector cursor.lastrowid 总是返回 0

sql-server - SQL Server 中的记录计数