I am running a batch of statements on several columns and tables and want to retrieve information on what errors occur.
The statement is a type change (varchar to nvarchar) and when it fails, it seems to return 2 errors.
Msg 5074, Level 16, State 1, Line 1 The object 'DF_XXX_YYY' is dependent on column 'YYY'.
Msg 4922, Level 16, State 9, Line 1 ALTER TABLE ALTER COLUMN Description failed because one or more objects access this column.
However, when I wrap it in a TRY/CATCH
block, and select ERROR_MESSAGE()
, it only returns the second error:
ALTER TABLE ALTER COLUMN Description failed because one or more objects access this column.
Ideally I would have it return the first message, as this is much more informative.
The exact SQL statement is:
begin try
alter table XXX
alter column YYY
nvarchar(200)
end try
begin catch
select ERROR_MESSAGE(), ERROR_LINE(), ERROR_NUMBER(), ERROR_PROCEDURE(), ERROR_SEVERITY(), ERROR_STATE()
end catch
Does anyone know how I can retrieve the more informative message? (@@ERROR
also returns the second error)
Depending on your needs and the permissions of the account that you are running this script under you may be able to use
DBCC OUTPUTBUFFER(@@spid)
.I came across this idea when reading Erland Sommarskog's Error Handling article. He links to a procedure
spGET_ErrorMessage
.Unfortunately this didn't quite work in my test script on SQL Server 2008 though so I'm not sure if the buffer format has changed but it might get there with a bit of tweaking!
Actual Output
Claimed Output
MikeCov has answered this, but I didn't want to trust the future documentation. The future is now, so I tested this and can confirm that THROW does indeed return all the error messages.
You can reproduce this with the below script. Run each section between the comments one at a time to see the output.
I know this is a bit old, but worth repeating here. This is a limitation of the error functions of sql, but looks like they are addressing for future versions.
Social MSDN question - sql inner exception error