2010-08-19 71 views
1

包含輸出語句的插入後的回滾失敗,並顯示 「ROLLBACK TRANSACTION請求沒有對應的BEGIN TRANSACTION。」 如果輸出語句被刪除,那麼它就起作用了。有沒有解釋這種行爲?SQL Server:插入後包含插入輸出的回滾神祕地失敗

例子:

create table test(i integer primary key) 
go 
begin transaction 
    insert into test (i) values (1) 
    insert into test (i) output inserted.i values (1) 
go 
rollback -- Fails 
go 

begin transaction 
    insert into test (i) values (1) 
    insert into test (i) values (1) 
go 
rollback -- Works 
go 

回答

2

我不知道爲什麼會這樣。它看起來像被設置SET XACT_ABORT ON隱含

上的SQL Server 2005 SP3一種解決方法,我們可以做到這一點,如果它的阻止你

create table test(i integer primary key) 
go 
DECLARE @foo TABLE (i int) 
begin TRANSACTION 
    insert into test (i) values (1) 
    insert into test (i) output inserted.i INTO @foo values (1) 
GO 
rollback --OK 
GO 

編輯:It could be that the OUTPUT clause is undefined

+0

謝謝,這是有效的。我只是把它寫成SQL Server中另一個必須解決的bug。 – 2010-08-19 10:51:11

1

FYI這個工作正常SQL 2008年,所以它一定在某個時候被糾正了。

+0

還有其他事情正在發生。在某些SQL 2008中起作用,而在其他一些情況下它不起作用。 select @@ version: works:Microsoft SQL Server 2008(RTM) - 10.0.1600.22(X64)Jul 9 2008 14:17:44 ... Windows NT 6.0上的標準版(64位)(Build 6001 :Service Pack 1) 失敗:Microsoft SQL Server 2008(SP1) - 10.0.2531.0(X64)Mar 29 2009 10:11:52 ... Windows NT 6.1上的標準版(64位)(內部版本7600: ) 作品:Microsoft SQL Server 2008(SP1) - 10.0.2531.0(X64)Mar 29 2009 10:11:52 ... Windows NT 6.1上的企業版(64位)(內部版本7600 :) – 2010-08-20 07:19:48

+0

問題是兼容性級別。它適用於兼容級別100(SQL Server 2008),並且失敗90和80. – 2010-08-20 14:12:36

+0

啊,很高興知道。所以這意味着它是「按設計」:) – 2010-08-21 01:06:18