【问题标题】:How to skip an error in a stored procedure如何跳过存储过程中的错误
【发布时间】:2015-09-08 19:36:32
【问题描述】:

目前,我有一个运行许多不同查询的存储过程。特别是一个查询将执行存储在我的计算机上的 CSV 文件的批量插入,当文件可用时,此批量插入效果很好。不幸的是,我并不总是有一个文件供此查询检索,导致我的存储过程停止并在该文件不存在时引发错误。什么是处理这种情况的好方法,以便存储过程继续完全执行,即使没有文件可供批量插入查询检索?

我尝试使用try catch 块,但是当我尝试运行该程序时它仍然给我同样的问题。话虽如此,这可能只是因为我没有正确实现try catch 块。除了try catch 块之外,我愿意尝试其他方式,这只是我见过使用最多的方式。

【问题讨论】:

  • TRY/CATCH 有效,但这并不能真正处理错误。这更像是抑制错误。为什么不检查文件是否存在,只有在存在时才尝试处理它?
  • 你的 catch 块是什么样的? try catch 块适用于不可预测的错误 - 因为这是可预测的,使用 if 语句可能会更好。查看系统存储过程:dbo.xp_fileexist
  • @SeanLange 我最初是这么想的,但很难找到一种方法来检查文件是否存在。

标签: sql sql-server tsql


【解决方案1】:

你应该可以像这样尝试捕获:

BEGIN TRY
    -- Code that might error here
END TRY
BEGIN CATCH
    -- Handle the error here
END CATCH

但在您的情况下,您的错误是可以预测的,您可以检查文件是否存在,然后使用if 语句仅在存在时执行该工作。

这是检查文件是否存在的方法。

@path 替换为您的文件路径。例如:N'C:\Temp\Test.csv'

DECLARE @result INT
EXEC master.dbo.xp_fileexist @path, @result OUTPUT

IF (@result = 1)
BEGIN
    -- Do your bulk insert here.
END

【讨论】:

  • 存在性检查 sn-p 效果很好!我确实对Try..Catch 有疑问。如果在存储过程中使用,是否可以在存储过程的开头开始尝试,然后在过程结束时结束,还是需要在每个查询上执行?
  • 您可以这样做 - 假设您可以从ERROR_MESSAGE()ERROR_LINE() 等处获得处理错误所需的信息。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多