这是我的存储过程
的执行流程:
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/