我使用的是SQL Server2005。我创建了一个大多数时候都可以使用的存储过程,但是我发现了一个实例,它无法满足我的要求。
目前,代码执行的操作是这样的
if @@error <> 0 begin select @message_error = "There was a database error adding product "+ @product + " to product line end
@message_error输出变量在哪里。
@message_error
因此,我可以select @@error得到一个数字,但我真正想要的只是SQL错误。
select @@error
像 Hey之类的 东西 ,我不能这样做,因为在此列上有fk约束 或其他 约束 。我在msdn http://msdn.microsoft.com/zh- cn/library/ms178592(v=sql.90).aspx上找到了这篇文章
但这只会抛出带有的自定义异常RAISERROR,我不想创建自己的错误消息或异常,我只是想知道为什么东西不起作用。我可以通过Management Studio执行存储过程,并查看确切的SQL错误,但是尝试匹配站点中的数据并以这种方式手动将其插入很繁琐。
RAISERROR
如何将SQL错误文本转换为输出变量?
这是我使用的存储过程模板的一部分:
/* CREATE PROCEDURE... */ DECLARE @ErrorMessage varchar(2000) ,@ErrorSeverity tinyint ,@ErrorState tinyint /* Additional code */ BEGIN TRY /* Your code here */ END TRY BEGIN CATCH SET @ErrorMessage = ERROR_MESSAGE() SET @ErrorSeverity = ERROR_SEVERITY() SET @ErrorState = ERROR_STATE() RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState) BREAK END CATCH /* Further cleanup code */
尝试/捕获块可能很棘手,但比@@ error更详尽。更重要的是,您可以在其中使用各种error_xxx()函数。在这里,我将正确的错误消息与足够的其他数据一起存储在变量@ErrorMessage中,以重新引发该错误。从这里开始,可以使用任意数量的选项。您可以将@ErrorMessage设置为输出变量,测试并处理特定的错误,或者构建自己的错误消息(或调整现有的错误消息以使其更清晰- 您可能会很烦恼地发现自己想要执行此操作的频率)。其他选项将向您展示。
需要注意的事情:在某些情况下,SQL会背对背抛出两个错误消息…并且error_message()只会捕获最后一个错误消息,该消息通常表示诸如“尝试创建对象失败”之类的内容,而真正的错误则在第一条错误消息。这是构建您自己的错误消息的地方。
error_message()