你能捕获错误消息中的坏t-sql吗?

时间:2015-07-09 17:52:56

标签: sql-server tsql error-handling

如果我运行如下的sql语句:

SELECT 1/0;

有没有办法捕获语句" SELECT 1/0;"在错误消息中?以下内容没有给出失败的SQL:

开始尝试     SELECT 1/0; 结束 开始捕捉        选择         ERROR_NUMBER()AS ErrorNumber,         ERROR_SEVERITY()AS ErrorSeverity,         ERROR_STATE()AS ErrorState,         ERROR_PROCEDURE()AS ErrorProcedure,         ERROR_LINE()AS ErrorLine,         ERROR_MESSAGE()AS ErrorMessage; 结束; GO

另外,我想知道是否可以避免在每个语句中使用try catch。我有一个SP,它在TRY和CATCH语句之间执行很多SQL语句。我想知道TRY ... CATCH块中众多SQL语句中哪一个SQL语句失败。

到目前为止我发现的所有内容都是提供错误消息的详细信息,但没有提供失败的T-SQL。

2 个答案:

答案 0 :(得分:1)

您可以利用表变量不回滚的事实。 在每个stament之后,将一个成功行插入到表变量中以进行记录。

如果proc成功,则不需要从表变量返回任何内容。如果它遇到了catch块,你可以回滚事务并从表变量或更好的方法中重新选择select,将该信息插入到日志表中。如果你的proc设置了很多变量,我也会在这个表中记录这些值,这样你就可以看到proc失败时的值。通过将其放入日志记录表中,您可以记录proc失败的所有时间,因此如果它在星期五晚上失败并且多次失败但不是每次都在周末失败,那么您将获得有关哪些有效以及哪些变量的数据在未能用来弄清楚发生了什么的时候。如果您使用动态sql,这尤其有用,因为您可以记录生成的sql语句。

答案 1 :(得分:0)

如果您的存储过程有大量语句,那么在存储过程开始时设置日志变量总是好的。您可以调整此变量的值以确保您想要记录步骤。在当前情况下,您可以将其设置为1并开始记录所有/必要步骤。这将帮助您找出执行的内容以及发生错误的位置。

Ex:DECLARE @bLog BIT = 0 - 当您不想记录时默认

SET @bLog = 1 IF(@bLog = 1) 开始  -----在这里添加日志,备份从前面步骤执行的结果--etc。 结束