I have a simple TRY CATCH with an embedded TRANSACTION in the below query.
I have a column name mistyped in the query: ItemID1 in the second UPDATE inside the TRANSACTION
When I run the query, I get the below error message which has a severity higher than 10:
Msg 207, Level 16, State 1, Line xxx Invalid column name ‘ItemID1’.
The 1st UPDATE ran successfully (where I was hoping it would ROLLBACK).
This shows that it never went to the CATCH block.
As per my understanding, the CATCH catches errors above severity 10. This one is severity 16, hence it should have caught it.
Any ideas why CATCH was never executed?
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
Object name resolution errors aren’t caught by TRY-CATCH.
From MSDN article here: