sql - 从 TRY CATCH 内的单个语句捕获多个错误消息

标签 sql sql-server-2008 tsql try-catch

我正在多个列和表上运行一批语句,并希望检索有关发生错误的信息。

该语句是类型更改(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/

相关文章:

sql-server-2008 - 调试存储过程的配置

sql - 我需要sql server中的一个函数来在输入字符串的每个位置插入一个空格

sql - Sybase SQL : How to check if date or timestamp field is empty

sql - 连续时间戳对之间间隔的中值长度

sql - 是否可以从一对多关系中的每一列获取最新值?

sql 在 ssms 中运行快在 asp.net 中慢

MySql Insert ON Duplicate Key 并选择不起作用

sql-server - 清除方案中的所有数据,保持结构完好无损

sql-server - 如何使用 SQL 查询像父子一样显示层次结构行

sql - 如何根据字段中的值截断或添加小数点 - SQL Server