首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能捕获错误消息中的错误t-sql吗?

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

Stack Overflow用户
提问于 2015-07-10 01:52:56
回答 3查看 133关注 0票数 0

如果我运行如下sql语句:

代码语言:javascript
复制
SELECT 1/0;

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

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

另外,我想看看是否可以避免在每条语句中都使用try catch。我有一个SP,它在TRY和CATCH语句之间执行大量SQL语句。我想知道在TRY的众多SQL语句中,哪条SQL语句失败了……捕捉块。

到目前为止,我所找到的只是给出了错误消息的详细信息,但没有给出失败的T-SQL。

EN

回答 3

Stack Overflow用户

发布于 2015-07-10 02:05:38

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

如果proc成功,则不需要从表变量返回任何内容。但是,如果它命中catch块,则可以回滚事务并从表变量返回select,或者更好的做法是将该信息插入到日志表中。如果您的proc设置了许多变量,我还会将这些值记录在此表中,以便您可以看到proc失败时的值。通过将其放入日志表中,您可以记录所有proc失败的次数,因此,如果它在周五晚上失败,并且失败了几次,但不是在周末每次都失败,那么您就可以获得关于失败时哪些工作和变量的数据,以确定发生了什么。如果您使用动态sql,这将特别有用,因为您还可以记录生成的sql语句。

票数 1
EN

Stack Overflow用户

发布于 2015-07-10 22:35:52

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

例如: DECLARE @bLog BIT =0 --不想记录日志时的默认值

SET @bLog =1 IF (@bLog = 1) BEGIN -在这里添加日志,备份之前的步骤执行的结果--等等。结束

票数 0
EN

Stack Overflow用户

发布于 2021-08-28 08:26:18

你可以使用行号,但是如果你想检查哪条语句有问题,那么你还必须定义语句号来检查行号,并在变量中设置相同的编号,如下所示。

代码语言:javascript
复制
Declare @StmNo as int
BEGIN TRY
    set @StmNo=1
    SELECT GETDATE();
    set @StmNo=2
    SELECT 1/0;
END TRY 
BEGIN CATCH 
        SELECT 
            @StmNo AS StatementNumber,
            ERROR_NUMBER() AS ErrorNumber, 
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState, 
            ERROR_PROCEDURE() AS ErrorProcedure, 
            ERROR_LINE() AS ErrorLine, 
            ERROR_MESSAGE() AS ErrorMessage; 
        END CATCH; 
        GO 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31324830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档