【问题标题】:SELECT query inside TRY CATCH returns empty result set even when error occurs即使发生错误,TRY CATCH 中的 SELECT 查询也会返回空结果集
【发布时间】:2014-08-15 21:20:50
【问题描述】:

如果您尝试在 MS SQL Server 中运行以下查询,您将看到两个结果集作为输出。我想知道即使发生错误,SELECT 语句仍然返回结果集的原因,以及发生错误时如何删除它。因为如您所见,我正在尝试返回另一个带有错误消息的结果集。

BEGIN TRY
    SET NOCOUNT ON;

    --invoke divide by zero error
    SELECT 1 / 0 AS DIVZEROERROR

END TRY

BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ERRRORMESSAGE;
END CATCH

【问题讨论】:

  • 如果删除TRY/CATCH 块,您仍然会得到一个结果集,与块相同。只是现在消息选项卡在 SSMS 中成为焦点。
  • @NickyvV 我已经编辑了我的问题。谢谢。
  • 我也有同样的问题。我有一个使用第一个结果集的应用程序,一个监控应用程序,这对我不起作用。

标签: sql sql-server select exception-handling


【解决方案1】:

请阅读以下关于 msdn 的文章: http://msdn.microsoft.com/en-IN/library/ms175976.aspx

这是因为 try-catch 不在任何存储过程中,它不会进入较低级别的执行。

【讨论】:

  • 您能详细说明一下吗?
【解决方案2】:

SQL Server 将结果流式传输到客户端。想象一个 10 亿行的查询。结果不会被缓冲,而是在可用时进行流式传输。

SQL Server 开始流式传输,然后才注意到错误,因为错误是在执行查询计划的过程中发生的。

将查询结果插入到临时表中,只有在没有发现错误时才选择该临时表的内容。

【讨论】:

  • 没有办法控制/停止这种行为“结果没有缓冲,而是在可用时进行流式传输。”在 SQL Server 中?
  • 不,只能通过使用临时表缓冲自己。结果可能是任意大的,比如 PB。这不是 SQL Server 自动完成的。 (也许您应该让您的查询不崩溃,或者将错误处理留给应用程序。为什么 proc 必须输出错误消息?应用程序可以捕获生成的 SqlException。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2021-06-10
相关资源
最近更新 更多