2013-06-03 57 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