sql-server - 我们的 SQL Server 存储过程 "dies"- 但我怎样才能找到原因呢?

标签 sql-server stored-procedures

我们有一个SQL Server存储过程,它执行一个非常长、痛苦的INSERT INTO.. SELECT FROM...命令。

然后,它通过第二个存储过程写入一条状态消息,说明它是否成功。

BEGIN TRY

    EXEC [Add_To_Log_Table] 'Starting the INSERT command...'

    INSERT INTO [Very_Large_Table]
    SELECT /* About 30 fields */
    FROM /* Lots of tables */ 

    EXEC [Add_To_Log_Table] 'The INSERT was successful.'

END TRY

BEGIN CATCH
    EXEC [Add_To_Log_Table] 'The INSERT failed, ' + ERROR_MESSAGE()
END CATCH

当我们的数据集很小时,这一切都可以很好地工作。 [Very_Large_Table] 被填充,并且我们的“插入成功。” 消息被写入我们的日志表。

但有时,当我们处理非常大的数据集时,“正在启动 INSERT 命令...”消息会写入我们的日志文件,事件监视器显示 INSERT 正在运行,但几分钟后,存储过程就“死了”。

CATCH 命令根本不会启动,因此我们无法检测或从这种情况中恢复。有没有办法找出原因?

我知道SQL Server Management Studio确实有一些日志(管理\SQL Server 日志),但这些日志没有显示发生任何错误。

我想知道 SQL Server 是否以某种方式将状态/最近的错误消息存储在其内部表之一中?

我们在 Windows Server 2008 R2 上运行 SQL Server 2008 R2,数据库使用的驱动器上有足够的可用硬盘空间,并且数据库恢复模式设置为 SIMPLE。

最佳答案

but after several minutes, the Stored Procedure just "dies".

The CATCH command simply doesn't kick in, so we have no way to detect or recover from this situation. Is there a way to find out what was the cause ?

如果在执行过程时发生命令超时,客户端 API 会发送一条通知以取消正在执行的查询。在这种情况下,CATCH block 将不会被执行,但应在应用程序代码中引发超时异常。确保应用程序正确处理和记录这些异常。

如果您无权访问应用代码,您可以创建跟踪(扩展事件或 SQL 跟踪)来​​捕获注意事件。

关于sql-server - 我们的 SQL Server 存储过程 "dies"- 但我怎样才能找到原因呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40632913/

相关文章:

sql-server - SQL Server 中旧的 row_number() 和新的基于 OFFSET + FETCH 的分页之间有什么区别?

sql - 如何编写以下输出的查询?

sql-server - 垂直表结构的 T-SQL 查询

postgresql - 使用 %TYPE 在 PostgreSQL 中声明复合类型的变量

sql-server - 如何删除 sql-server 中的重音符号和所有字符 <> a..z?

sql-server - SSRS : Change SQL Statement Dynamically

mysql - canhan数据库: How to move data from non details-table to details-table?

c++ - 为什么从客户端应用程序调用 SQL 引擎来调用 PL/SQL?

c# - 在 C# 中执行 Oracle 解释计划

sql-server - 从 NHibernate 调用 SQL Server 存储过程时,我可以将列表或自定义数据类型作为参数传递吗