sql - 事务内插入失败,但 sql server 返回 1 行受影响?

标签 sql sql-server sql-server-2008 tsql

这是我的存储过程的执行流程:

ALTER procedure dbo.usp_DoSomething

as

declare @Var1 int
declare @Var2 int
declare @Var3 int

select 
@Var1 = Var1,
@Var2 = Var2,
@Var3 = Var3
from Table
where  
...

BEGIN TRY
    BEGIN TRANSACTION
        /* UPDATE Table. This executes successfully */

        /* INSERT Table. This fails due to PK violation */

        COMMIT TRAN /* This does not happen */
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRAN /* This occurs because TRANS failed */
END CATCH

UPDATE 成功运行。 INSERT 失败,因此事务 被回滚。

执行后,表格看起来正确,没有任何变化。但是当我运行 SP 时,我收到以下消息:

(1 row(s) affected)

(0 row(s) affected)

所以我问自己,受影响的前 1 行 来自哪里?

然后我就想是这个原因,但是想确认一下:OUTPUT Clause (Transact-SQL)

An UPDATE, INSERT, or DELETE statement that has an OUTPUT clause will return
rows to the client even if the statement encounters errors and is rolled back.
The result should not be used if any error occurs when you run the statement.

最佳答案

默认情况下,将为每个 DML 语句返回行计数,除非启用了 SET NOCOUNT ON。无论事务是否成功、回滚或提交,您的 UPDATE 语句都会成功,因此会收到通知(1 行受影响)

您提到的 OUTPUT 子句与此无关,因为您没有指定它。

关于sql - 事务内插入失败,但 sql server 返回 1 行受影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36698868/

相关文章:

php - 在带有组标题的表中显示 mysql 数据

php - OFFSET OR LIMIT 在 Mysql 中高效

mysql - SQL: N-N Select * from table1 并检测是否与特定用户 ID 的另一个存在关系

sql - 用于过滤日期时间变量大于或等于当月第一天的记录的 T-SQL 语法

sql - 连接 3 个表只得到两行

sql-server - 连接多个表中的多行

按年份对多个指标进行 SQL 透视

sql-server - Azure 数据库无法查询表

sql - 使用sql基于时间的过滤

sql - 如何使用 SUM() 等 SQL 将列中的所有值相乘