2013-06-03 87 views
1

我想問爲什麼(嘗試捕獲)不能正確工作,因爲何時是人爲錯誤2觸發器顯示問題。不要詢問表人和表人2之間的差異,這只是示例問題。嘗試捕獲不正常T-SQL

CREATE TRIGGER Example 
ON Person 
after INSERT 
AS 

BEGIN TRY 
    INSERT INTO [Person2] 
    SELECT 
     inserted.Name, 
     inserted.Surname, 
     inserted.Age, 
     inserted.Street 
    FROM inserted 
END TRY 
BEGIN CATCH 
END CATCH 

插入工作正確的,如果觸發delated

INSERT INTO Person 
Values 
('Jhon', 'Kowalsky', '12', null) 

錯誤

(0行(S)的影響)

消息3616,級別16,狀態1,行1在執行觸發器 期間發生錯誤。該批次已被中止,並且用戶事務(如果有 any)已被回滾。

表的人 - 在這裏你可以看到人與人2街之間的一個區別允許空值

enter image description here

表2個人 - 在這裏你可以看到人和人的2個街道沒有按」之間的一個區別牛逼允許空值

enter image description here

+7

'XACT_ABORT'隱含在內部觸發器上。 –

+0

@Martin Smith你能寫這個答案嗎?因爲現在工作正確。感謝您的幫助。 –

回答

1

嘗試這一個 -

CREATE TRIGGER dbo.Example 

    ON dbo.Person 
    AFTER INSERT 

AS 
BEGIN 
    SET NOCOUNT ON 
    SET XACT_ABORT ON 

    DECLARE @OwnTran BIT 

    SET @OwnTran = 0 

    IF @@TRANCOUNT = 0 
     BEGIN 
      SET @OwnTran = 1 
      BEGIN TRAN 
     END 

    BEGIN TRY 

     INSERT INTO dbo.Person2 (Name, Surname, Age, Street) 
     SELECT 
       i.Name 
      , i.Surname 
      , i.Age 
      , i.Street 
     FROM INSERTED i 

    END TRY 
    BEGIN CATCH 

     DECLARE @em NVARCHAR(MAX), @sev INT, @st INT 

     SELECT @em = ERROR_MESSAGE(), 
       @sev = ERROR_SEVERITY(), 
       @st = ERROR_STATE() 

     RAISERROR(@em, @sev, @st) 

     IF @@TRANCOUNT > 0 
      ROLLBACK TRAN 

    END CATCH 

    IF @OwnTran = 1 AND @@TRANCOUNT > 0 
    BEGIN 
     COMMIT TRAN 
    END 

END