try catch无法正常使用T-SQL

时间:2013-06-03 07:30:11

标签: sql-server tsql

我想问为什么(尝试捕获)不能正常工作,因为什么时候出现错误2触发器显示问题。不要问桌子和桌子2之间的不同这只是表示问题的例子。

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

如果触发延迟,则插入工作正确

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

错误

  

(0行(s)受影响)

     

消息3616,级别16,状态1,行1在触发期间出现错误   执行。批处理已中止,用户事务处理如果   任何,已被回滚。

表人 - 在这里你可以看到人与人之间的一个区别2街道允许空值

enter image description here

表人员2 - 在这里你可以看到人与人之间的一个区别2街道不允许空值

enter image description here

1 个答案:

答案 0 :(得分: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