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