0

我有一个简单的 TRY CATCH,在下面的查询中嵌入了 TRANSACTION。
我在查询中输入了错误的列名:ItemID1在运行查询时的第二个UPDATETRANSACTION
,我收到以下严重性高于 10 的错误消息:

消息 207,级别 16,状态 1,第 xxx 行无效的列名称“ItemID1”。

第一次UPDATE成功运行(我希望它会ROLLBACK)。
这表明它从未进入CATCH区块。
根据我的理解,CATCH捕获了 10 以上严重性的错误。这个是严重性 16,因此它应该已经捕获了它。任何想法为什么CATCH从未被执行?

BEGIN TRY
    IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL 
        DROP TABLE #MyTempTable
    CREATE TABLE #MyTempTable
        (
          ObjectID UNIQUEIDENTIFIER , OrgID NVARCHAR(20)
        )

    INSERT  INTO #MyTempTable
            SELECT  ObjectTable1.ObjectID AS ObjectID ,OrgID 
            FROM    ObjectTable1 WITH ( NOLOCK ) INNER JOIN Org WITH ( NOLOCK ) ON ObjectTable1.OrgID = Org.OrgID
            WHERE   OrgID IN ('Blah1', 'Blah2')

    INSERT  INTO #MyTempTable
            SELECT  ObjectTable2.ObjectID AS ObjectID, OrgID
            FROM    ObjectTable2 WITH ( NOLOCK ) INNER JOIN Org WITH ( NOLOCK ) ON ObjectTable2.OrgID = Org.OrgID
            WHERE   OrgID IN ('Blah3', 'Blah4')

    SELECT  * FROM #MyTempTable

    BEGIN TRANSACTION
        UPDATE  ObjectTable1 
        SET ItemID = NULL FROM ObjectTable1 INNER JOIN #MyTempTable ON #MyTempTable.ObjectID = ObjectTable1.ObjectID
        PRINT 'Updated ' + CAST(@@ROWCOUNT AS VARCHAR(20)) + ' Objects in ObjectTable1'

        UPDATE  ObjectTable2
        SET     ItemID = (ItemID1 + 1) FROM ObjectTable2 INNER JOIN #MyTempTable ON #MyTempTable.ObjectID = ObjectTable2.ObjectID
        PRINT 'Updated ' + CAST(@@ROWCOUNT AS VARCHAR(20)) + ' Objects in ObjectTable2'
    COMMIT
    DROP TABLE #MyTempTable
END TRY

BEGIN CATCH
    IF @@TRANCOUNT > 0 
        ROLLBACK
    DROP TABLE #MyTempTable

    DECLARE @ErrMsg NVARCHAR(4000) ,
        @ErrSeverity INT
    SELECT  @ErrMsg = ERROR_MESSAGE() ,
            @ErrSeverity = ERROR_SEVERITY()
    RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
4

1 回答 1

2

TRY-CATCH 不会捕获对象名称解析错误。从这里的MSDN 文章:

以下类型的错误发生在与 TRY...CATCH 构造相同的执行级别时,不会由 CATCH 块处理:

  • 编译错误,例如语法错误,阻止批处理运行。
  • 在语句级重新编译期间发生的错误,例如由于延迟名称解析而在编译后发生的对象名称解析错误。
于 2012-08-31T14:53:28.707 回答