2014-06-17 141 views
1

我遇到了這樣的問題。我有這個事務,$(FilePath)指定另一個腳本,它應該開始運行。內部回滾事務回滾外部

BEGIN TRANSACTION 
:r $(FilePath) 
GO 
IF(@@ERROR <> 0) 
    BEGIN 
     ROLLBACK TRANSACTION 
    END 
ELSE 
    BEGIN 
     COMMIT TRANSACTION 
    END 

(請注意,由SQLCMD稱爲腳本大多不包含transacions) 的問題是,如果被調用的腳本中含有回滾事務,然後它也回滾外部事務。內部腳本不包含命名事務,並且有太多腳本來重寫每個要命名的事務。

有沒有辦法讓這個事務只回滾,如果相應的回滾事務運行?

謝謝

+0

將您的交易命名爲@NickyvV寫道。 – Tomasito

+0

這聽起來像是您無法控制您正在運行的腳本的內容 - 如果是這種情況,那麼您就無能爲力。 SQL Server不支持真正的嵌套事務。 –

+0

是的,我不允許重寫腳本,但我必須在事務中運行它們。 – Gabor

回答

4

嘗試使用savepoint_nameROLLBACK聲明等中記載here
沒有這個保存點的ROLLBACK語句回滾事務的最外層BEGIN TRANSACTION語句作爲設計的。

ROLLBACK { TRAN | TRANSACTION } 
    [ transaction_name | @tran_name_variable 
    | savepoint_name | @savepoint_variable ] 
[ ; ] 

回滾事務未經savepoint_name或transaction_name 回滾到事務的開始。嵌套0​​事務時,此相同的語句將所有內部事務回滾到 最外面的BEGIN TRANSACTION語句。在這兩種情況下,ROLLBACK TRANSACTION將@@ TRANCOUNT系統函數遞減爲0. ROLLBACK TRANSACTION savepoint_name不遞減@@ TRANCOUNT。

+0

謝謝,但那不行。問題在於腳本中已經存在已寫入的事務,這些事務包含非命名的事務,我不允許對它們進行命名。即使我願意,這仍然不是一種選擇,因爲大約有8-900個腳本。 – Gabor