如果我运行如下sql语句:
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。
发布于 2015-07-10 02:05:38
您可以利用表变量不会回滚这一事实。在每一段之后,将一条成功行插入到一个表变量中以进行日志记录。
如果proc成功,则不需要从表变量返回任何内容。但是,如果它命中catch块,则可以回滚事务并从表变量返回select,或者更好的做法是将该信息插入到日志表中。如果您的proc设置了许多变量,我还会将这些值记录在此表中,以便您可以看到proc失败时的值。通过将其放入日志表中,您可以记录所有proc失败的次数,因此,如果它在周五晚上失败,并且失败了几次,但不是在周末每次都失败,那么您就可以获得关于失败时哪些工作和变量的数据,以确定发生了什么。如果您使用动态sql,这将特别有用,因为您还可以记录生成的sql语句。
发布于 2015-07-10 22:35:52
如果您的存储过程有很多语句,那么在存储过程的开头设置一个日志变量总是很好的。您可以调整此变量的值,以确保是否要记录步骤。在您当前的情况下,您可以将其设置为1并开始记录所有/必要的步骤。这将帮助您找出执行了什么以及错误发生在哪里。
例如: DECLARE @bLog BIT =0 --不想记录日志时的默认值
SET @bLog =1 IF (@bLog = 1) BEGIN -在这里添加日志,备份之前的步骤执行的结果--等等。结束
发布于 2021-08-28 08:26:18
你可以使用行号,但是如果你想检查哪条语句有问题,那么你还必须定义语句号来检查行号,并在变量中设置相同的编号,如下所示。
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 https://stackoverflow.com/questions/31324830
复制相似问题