2016-04-01 45 views
1

我所著此觸發器:EXECUTE後的事務計數表示不匹配的BEGIN和COMMIT語句數。先前計= 1,當前計數= 2

ALTER TRIGGER [dbo].[trg_abort_insert] 
ON [dbo].[F_DOCCURRENTPIECE] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON 
SET XACT_ABORT ON 
BEGIN TRY 
    BEGIN TRAN 

IF EXISTS (SELECT * 
      FROM Inserted i 
      INNER JOIN Deleted d ON i.CBMARQ= d.CBMARQ 
      WHERE i.DC_Piece <> d.DC_Piece 
      AND i.DC_Domaine = 0 

      AND i.DC_IdCol = 6) 
COMMIT TRAN 
END TRY 
BEGIN CATCH 
SELECT ERROR_MESSAGE() 
IF @@TRANCOUNT>0 
     ROLLBACK 
END CATCH; 
END 

我'具有這樣的錯誤: 事務計數EXECUTE後指示開始和提交語句的不匹配數。上一個計數= 1,當前計數= 2

Pleaze幫我

+2

問題是因爲你有一個事務觸發器。這導致無盡的悲傷。我99.9999%確定你的調用代碼在交易中是正確的?從您的觸發器中移除交易。 –

+0

好吧,當我刪除開始交易和提交交易,然後觸發就像不認識趕上。開始反式和提交是必不可少的,因爲代碼不會只用try catch執行,當我刪除ty catch時,我有這個錯誤:事務在觸發器中結束。該批次已被中止。 – hollyx

+0

事務的存在不影響語句流或阻止try/catch的工作。你真的想在這裏做什麼?觸發器中的事務不起作用,因爲在任何dml語句中都已經存在隱式觸發器。如果你能解釋你的要求,我們可以幫你解決這個問題。 –

回答

2

這是因爲你已經嵌套事務。我的意思是,當觸發被解僱時,交易是開放的。您需要修改您的觸發器來處理嵌套事務類似下面:

create TRIGGER [dbo].[trg_abort_insert] 
ON [dbo].[F_DOCCURRENTPIECE] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON 
SET XACT_ABORT ON 
declare @trancount int = @@trancount 

BEGIN TRY 
    if @trancount > 0 
     begin 
      save transaction t1 
     end 
    else 
     begin 
      begin transaction 
     end 

IF EXISTS (SELECT * 
      FROM Inserted i 
      INNER JOIN Deleted d ON i.CBMARQ= d.CBMARQ 
      WHERE i.DC_Piece <> d.DC_Piece 
      AND i.DC_Domaine = 0 

      AND i.DC_IdCol = 6) 

    if @trancount = 0 
     begin   
      COMMIT TRAN 
     end 
END TRY 
BEGIN CATCH 

    if @trancount > 0 
     rollback transaction t1 
    if @trancount = 0 
     rollback transaction 
    SELECT ERROR_MESSAGE() 

END CATCH; 

這應該爲你工作。讓我知道這是否有幫助。

+0

非常感謝你,我剛剛嘗試過,它工作得很好,Iam很感激 – hollyx

+0

我很高興我可以幫助.. – sam

相關問題