11

我正在使用 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 错误文本放入输出变量?

4

3 回答 3

21

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

/*  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()只会捕获最后一条,通常会说“尝试创建对象失败”,真正的错误在第一条错误消息。这是构建您自己的错误消息的地方。

于 2012-11-30T15:05:22.680 回答
12

您可以使用一般的 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
于 2012-11-30T15:00:09.430 回答
3

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

于 2012-11-30T15:01:06.353 回答