如何从SQL Server中的try / catch子句获取内部错误

时间:2011-08-02 18:14:11

标签: sql sql-server-2005 tsql sql-server-2008

我在try / catch中运行SQL Server 2008中的存储过程。存储过程和它调用的存储过程会引发一些错误,但在try / catch中,您只能从正在运行的存储过程中获取最后一个错误。

有没有办法/技巧能够以某种方式捕获子存储过程调用在运行特定存储过程时产生的所有错误? (假设您无法访问任何存储过程,因此您无法修改它们可以编写错误的位置,即您不能只是更改所有存储过程以停止引发错误,而是将它们写入某个表和您的catch中从该表中读取)

3 个答案:

答案 0 :(得分:3)

这是一个很好的资源,用于处理SQL Server中的错误处理。 http://www.sqlservercentral.com/articles/Development/anerrorhandlingtemplatefor2005/2295/

但是,某些方法要求您能够更改代码以捕获错误。真的没办法解决这个问题。你不能只是忽略错误,继续处理,然后来处理错误。在大多数(如果不是全部)语言中,必须在引发异常时处理异常。 T-SQL也不例外。

我个人使用存储过程来记录任何错误。这是我使用的:

CREATE PROCEDURE [dbo].[Error_Handler]
@returnMessage bit = 'False'
WITH EXEC AS CALLER
AS
BEGIN

  INSERT INTO Errors (Number,Severity,State,[Procedure],Line,[Message])
  VALUES (
    ERROR_NUMBER(),
    ERROR_SEVERITY(),
    ERROR_STATE(),
    isnull(ERROR_PROCEDURE(),'Ad-Hoc Query'),
    isnull(ERROR_LINE(),0),
    ERROR_MESSAGE())

  IF(@returnMessage = 'True')
  BEGIN
    select Number,Severity,State,[Procedure],Line,[Message]
    from Errors
    where ErrorID = scope_identity()
  END
END

答案 1 :(得分:1)

如果存储了多个错误的存储过程,则无论如何都需要更换它们。您的数据库中可能存在数据完整性错误。这是至关重要的,“一切都需要立即停止,直到这个问题得到解决”这一问题。如果您无法替换它们并且它们被错误地写入以允许在达到错误时继续处理,那么我知道无法找到错误。除非您告诉记录错误,否则不会记录错误。如果存储的procs属于您从其他供应商处购买的产品,这就是您无法更改它们的原因,那么您最好的选择是更改为实际了解如何编写数据库代码的供应商,因为没有严重打捞的产品

答案 2 :(得分:1)

错误后,您不会有Java或c#方法引发错误。你为什么期望SQL允许这个?异常是异常

如果数据库引擎抛出错误,那么就会遇到问题。

我以前做的是分开测试和检查代码:首先找出wronf是什么然后抛出一个异常如果没有错误,请写下来。