我正在多个列和表上运行一批语句,并希望检索有关发生错误的信息。
该语句是类型更改(varchar 到 nvarchar),当它失败时,它似乎返回 2 个错误。
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.
但是,当我将其包装在 TRY/CATCH
block 中并选择 ERROR_MESSAGE()
时,它仅返回第二个错误:
ALTER TABLE ALTER COLUMN Description failed because one or more objects access this column.
理想情况下,我希望它返回第一条消息,因为这提供了更多信息。
具体的SQL语句是:
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
有谁知道我如何检索信息更丰富的消息? (@@ERROR
也会返回第二个错误)
最佳答案
根据您的需要以及运行此脚本的帐户的权限,您也许可以使用DBCC OUTPUTBUFFER(@@spid)
。
我在阅读 Erland Sommarskog 的 Error Handling article 时想到了这个想法。 。他链接到一个程序 spGET_ErrorMessage
。
不幸的是,这在我的 SQL Server 2008 测试脚本中不太有效,所以我不确定缓冲区格式是否已更改,但可能需要进行一些调整才能实现!
CREATE TABLE #foo
(
c INT DEFAULT(0)
)
ALTER TABLE #foo ALTER COLUMN c VARCHAR(10)
GO
EXEC spGET_LastErrorMessage
实际输出
Msg 5074, Level 16, State 1, Line 2
The object 'DF__#foo___________c__6DCC4D03' is dependent on column 'c'.
Msg 4922, Level 16, State 9, Line 2
ALTER TABLE ALTER COLUMN c failed because one or more objects access this column.
声称的输出
errNumber errState errLevel errMessage errInstance errProcedure errLine
-------------------- ----------- ----------- ---------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------- --------------- -----------
5074 1 16 The object 'DF__#foo___________c__6DCC4D03' is dependent on column 'c'. MARTINHP NULL 2
4922 9 16 The object 'DF__#foo___________c__6DCC4D03' is dependent on column 'c'.ALTER TABL MARTINHP 䄀䰀吀䔀刀 䌀伀䰀唀䴀一 挀 昀愀椀氀攀搀 戀攀挀愀甀猀攀 漀渀攀 漀爀 洀漀爀攀 漀戀樀攀挀琀猀 愀挀挀攀猀猀 琀栀椀 NULL 117
关于sql - 从 TRY CATCH 内的单个语句捕获多个错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697492/