fdk*_*fsf 7 sql t-sql sql-server sql-server-2008
这是我的执行流程stored procedure
:
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
Run Code Online (Sandbox Code Playgroud)
在UPDATE
成功运行.的INSERT
失败,所以transaction
被回滚.
执行后,表格看起来正确,没有任何变化.但是当我运行SP时,我收到以下消息:
(1 row(s) affected)
(0 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
所以我问自己,第1 row(s) affected
一个来自哪里?
然后我想这就是原因,但是想确认一下:OUTPUT子句(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.
Run Code Online (Sandbox Code Playgroud)
SET NOCOUNT ON
默认情况下,除非启用,否则将为每个 DML 语句返回行计数。无论事务是否成功,或者回滚或提交,您的 UPDATE 语句都是成功的,因此会收到通知(1 row(s) affected)
。
你提到的条款OUTPUT
与此无关,因为你没有指定它。