0

我需要帮助在 SQL Server 2000 中记录来自 T-SQL 的错误。我们需要记录我们捕获的错误,但是在获取与我们在 SQL Server Management Studio 前面会得到的相同信息时遇到了麻烦。

我可以在没有任何参数替换的情况下收到这样的消息:

SELECT MSG.description from master.dbo.sysmessages MSG
INNER JOIN sys.syslanguages LANG ON MSG.msglangID=LANG.msglangid
WHERE MSG.error=@err AND LANG.langid=@@LANGID

但我还没有找到任何找出错误参数的方法。我想看看:

表 MYTABLE7 上的约束违反 MYCONSTRAINT2

不是

表 %s 上的约束违反 %s

谷歌搜索只发现了使用 DBCC OUTPUTBUFFER 的奇异方案,这些方案需要管理员访问权限并且不适合生产代码。如何获得带有参数替换的错误消息?

4

4 回答 4

2

在 .Net 中,从 sql server 检索错误消息(以及printraiserror的任何输出)就像在 SqlConnection ( .FireInfoMessageEventOnUserErrors = True )上设置一个属性并处理连接的 InfoMessage 事件一样简单。.Net 接收的数据与您在 SQL Server Management Studio 结果网格的“消息”窗口中获得的数据相匹配。

所有代码都在处理事件的函数中,您可以将其抽象化,以便所有连接都指向同一个方法,因此除了创建时的两行代码外,应用程序的其余部分没有任何其他更改设置属性和事件的新连接(你已经把它抽象出来了,所以你只需要在一个地方做,对吧?

这是我认为SQL Server 的权威错误指南的链接。
http://www.sommarskog.se/error-handling-I.html

在某些情况下,即使发生错误,SQL Server 也会继续处理。请参阅标有“发生错误时会发生什么”的标题?从上一个链接。

于 2008-09-24T16:38:13.493 回答
1

在在线书籍中查找 Raiserror(已描述)

您会发现语法如下所示:

RAISERROR ( { msg_id | msg_str } { , severity , state } 
    [ , argument [ ,...n ] ] ) 
    [ WITH option [ ,...n ] ] 

错误参数如下:

d or I Signed integer 
o Unsigned octal 
p Pointer 
s String 
u Unsigned integer 
x or X Unsigned hexadecimal 

从 VB 开始的任何语言都有能力捕捉这些并让您采取适当的行动。

戴夫·J

于 2008-09-24T17:09:56.070 回答
0

FORMATMESSAGE(它也存在于 SQL Server 2000 中)允许您从上述 sysmessages 模板将消息构建为最终格式。

但是,RAISERROR 命令(当您遇到错误时,这几乎是数据库引擎本身在内部调用的内容)已经发送了完整的文本,这些文本可以被捕获并记录在客户端中。SSMS 是一个客户端,不会生成它自己的消息:所有消息都来自数据库引擎。

但是,我认为您想使用 T-SQL 记录 T-SQL 错误。坦率地说,你不能在 SQL Server 2000 上。太多的错误是批处理和范围中止,无法可靠地记录任何内容。

您必须在 SQL Server 2005 上才能使用 TRY/CATCH/ERROR_MESSAGE,或者您在客户端中捕获,然后使用类似 log4net 的东西重新登录到 SQL Server。

于 2009-06-08T04:37:58.003 回答
0

您有可能很快升级到 SQL2005 吗?如果是这样,您可能可以利用他们的 TRY/CATCH 模型来更轻松地完成您想要做的事情。

catch 中公开的变量可以为您提供引发错误的对象、行号、错误消息、严重性等。从那里,您可以记录它、发送电子邮件等。

于 2008-09-24T16:25:22.963 回答