0

以下のクエリにTRANSACTIONが埋め込まれた単純なTRYCATCHがあります。
クエリで列名の入力を間違えました。クエリを実行すると、ItemID1次 のエラーメッセージが表示されます。重大度は10を超えています。UPDATETRANSACTION

メッセージ207、レベル16、状態1、行xxx無効な列名'ItemID1'。

1つ目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 に答える