如何在存储过程中获取sql错误

时间:2012-11-30 14:47:02

标签: sql sql-server tsql sql-server-2005 stored-procedures

我正在使用SQL Server 2005.我创建了一个大部分时间都可以工作的存储过程,但是我发现了一个不能满足我想要的实例。

目前,代码执行类似这样的操作

if @@error <> 0
  begin
   select @message_error = "There was a database error adding product "+ @product + " to product line
  end

其中@message_error是输出变量。

所以,我可以select @@error得到一个数字,但我真正想要的只是SQL错误。

之类的东西嘿,我不能这样做,因为这个列或其他什么都有fk约束。我在msdn上发现了这篇文章  http://msdn.microsoft.com/en-us/library/ms178592(v=sql.90).aspx

但它只会用RAISERROR抛出自定义异常,我不想创建自己的错误消息或异常,我只是想知道为什么东西不起作用。我可以通过Management Studio执行存储过程并查看确切的SQL错误,但尝试匹配来自站点的数据并手动插入它是很乏味的。

如何将SQL错误文本输入到输出变量中?

3 个答案:

答案 0 :(得分:16)

这是我使用的存储过程模板的一部分:

/*  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  */

Try / Catch块可能很棘手但比@@ error更彻底。更重要的是,您可以使用其中的各种error_xxx()函数。在这里,我将正确的错误消息存储在变量@ErrorMessage中,还有足够的其他数据来重新引发错误。从这里可以获得任意数量的选项;你可以让@ErrorMessage成为一个输出变量,测试并处理特定的错误,或者构建你自己的错误消息(或者调整现有的错误消息 - 你可能会发现你想要这样做的频率很烦恼)。其他选项将提出这些问题。

需要注意的事项:在某些情况下,SQL会抛出两个错误消息...而error_message()只能捕获最后一个错误消息,这通常会说“尝试创建对象失败” ,第一条错误消息中给出了实际错误。这是构建您自己的错误消息的地方。

答案 1 :(得分:11)

您可以使用一般的Try / Catch,然后在CATCH部分中构建有关错误的更多详细信息,例如

DECLARE @DetailedErrorDesc VARCHAR(MAX)
BEGIN TRY

--tsql code goes here

END TRY
BEGIN CATCH

SELECT @DetailedErrorDesc =         
  CAST(ERROR_NUMBER() AS VARCHAR) + ' : '+
  CAST(ERROR_SEVERITY() AS VARCHAR) + ' : ' +
  CAST(ERROR_STATE() AS VARCHAR) + ' : ' +
  ERROR_PROCEDURE() + ' : ' +
  ERROR_MESSAGE() + ' : ' +
  CAST(ERROR_LINE() AS VARCHAR);

--Now you can decide what to do with the detailed error message....return it or log it etc

END CATCH

答案 2 :(得分:3)

使用try ... catch并在catch块中可以使用ERROR_MESSAGE(),ERROR_LINE(),ERROR_PROCEDURE(),ERROR_STATE(),ERROR_SEVERITY(),ERROR_NUMBER()函数