从SQL Server 2000错误中检索错误文本
我需要帮助来记录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提出了异国情调的方案,该方案需要管理员访问权限,并且不适用于生产代码。如何获得带有参数替换的错误消息?
解决方案
我们有机会很快升级到SQL2005吗?如果是这样,我们可能可以利用他们的TRY / CATCH模型来更轻松地完成我们要尝试执行的操作。
捕获中公开的变量可以为我们提供引发错误,行号,错误消息,严重性等的对象。从那里,我们可以对其进行记录,发送电子邮件等。
在.Net中,从sql服务器检索错误消息(以及从print或者raiserror输出的任何内容)就像在SqlConnection上设置一个属性(.FireInfoMessageEventOnUserErrors = True)并处理连接的InfoMessage事件一样简单。 .Net接收的数据与我们在SQL Server Management Studio结果网格的"消息"窗口中获得的数据匹配。
所有代码都放入处理事件的函数中,我们可以对其进行抽象处理,以便所有连接均指向同一方法,因此在创建应用程序时,除了两行代码外,其余所有内容均无更改设置属性和事件的新连接(我们已经将其抽象了,因此只需要在一个地方进行,对吧?)
这是指向我认为适用于SQL Server的最终错误指南的链接。
http://www.sommarskog.se/error-handling-I.html
在某些情况下,即使出现错误,SQL Server也会继续处理。请参阅标题为"发生错误时会发生什么?"的标题。来自上一个链接。
在线查找书籍中的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
FORMATMESSAGE(在SQL Server 2000中也存在)使我们可以从上面的sysmessages模板中将消息构建为最终格式。
但是,RAISERROR命令(当发生错误时,数据库引擎本身在内部调用时几乎使用该命令)已经发送了完整的文本,可以将其捕获并记录在客户端中。 SSMS是客户端,不会生成自己的消息:所有消息都来自数据库引擎。
但是,我搜集到我们想使用T-SQL记录T-SQL错误的信息。坦白地说,我们不能在SQL Server 2000上使用。批处理和范围中止错误太多,无法可靠地记录任何内容。
我们必须在SQL Server 2005上才能使用TRY / CATCH / ERROR_MESSAGE,或者陷于客户端,然后使用诸如log4net之类的内容登录回SQL Server。