Sql server “我们的SQL Server存储过程”;模具";-但是我怎样才能找到原因呢?

Sql server “我们的SQL Server存储过程”;模具";-但是我怎样才能找到原因呢?,sql-server,stored-procedures,Sql Server,Stored Procedures,我们有一个SQL Server存储过程,它在..中插入了很长很痛苦的。。从…命令中选择 然后,它通过第二个存储过程写入一条状态消息,以说明它是否成功 BEGIN TRY EXEC [Add_To_Log_Table] 'Starting the INSERT command...' INSERT INTO [Very_Large_Table] SELECT /* About 30 fields */ FROM /* Lots of tables */

我们有一个SQL Server存储过程,它在..中插入了很长很痛苦的
。。从…
命令中选择

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

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\u Large\u Table]
被填充,我们的
插入成功。
消息被写入我们的日志表

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

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

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

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


我们正在运行SQL Server 2008 R2,在Windows Server 2008 R2上,我们的数据库使用的驱动器上有大量可用硬盘空间,数据库恢复模式设置为“简单”。

此部分看起来可疑

当我们处理非常大的数据集时,“Starting the INSERT command…”消息被写入日志文件,活动监视器显示INSERT正在运行,但几分钟后,存储过程就“死了”

这可能是由于
select
part花费了大量时间,或者
insert
由于许多索引或许多因素而造成开销

我解决这个问题的方法如下

1.再次运行查询
2.打开新的查询窗口并运行下面的命令

select status,blocking_session_id,wait_type,last_Wait_type
from
sys.dm_exec_requests where session_id=<<your query sessionid>>
不是所有的时候,你都可以看到你的会话在运行,有些时候你在EXEC_REQUESTS DMV中看不到它,在这种情况下,你可以使用下面的方法

select * from sys.processes
您可能会得到不同的等待类型,比如IO。在这种情况下,您必须根据该类型进行故障排除,并尝试添加好的索引,这样您的select将运行得更快,这也可能是内存问题,因为如果内存不足,sql将来回交换数据,甚至好的查询也会受到影响

总之,知道等待类型是什么,并在此基础上进行故障排除

但几分钟后,存储过程就“死了”

CATCH命令根本不起作用,因此我们无法检测 或者从这种情况中恢复过来。有没有办法找出是什么 原因是什么


如果在执行proc时发生命令超时,则客户端API将发送一个通知以取消正在执行的查询。在这种情况下,不会执行CATCH块,但应在应用程序代码中引发超时异常。确保应用程序正确处理和记录错误。如果您没有访问应用程序代码的权限,可以创建跟踪(扩展事件或SQL跟踪)来捕获注意事件。

大多数注释都假设此过程正在运行,只需要调试。我个人经历过几次,它确实“死了”。错误日志中没有任何内容。没有返回代码。调试消息将直接出现在存储过程调用之前,然后什么都没有,就结束了。但是,如果您单独调用存储过程,它就可以正常工作。这种现象只会发生在更复杂的情况下,即一个称为触发器的存储过程调用了另一个称为另一个触发器的存储过程。在一种情况下,它通过修改过程的长度来处理问题——过程的实际物理长度。在尝试过程中,如果我更早地取出一些代码,它将在稍后的某个时间死去。我无意中发现了这条线索,因为我现在遇到了这种情况,仍然需要找到原因或解决办法。当我找到这个例子时,我会发布。

从来没有听说过“sp死亡”这个词,但不管怎样,当你认为它已经死亡时,你有没有检查过任何死锁?我的意思是不要死。在sql server中启动的任何进程(本例中为Sp执行)在sql server中可能有三种状态,
正在运行
可运行
已挂起
。当您认为SP已死机时,请在单独的窗口中运行
SP_who2
,查看SP的进程发生了什么变化,您只需了解执行SP的过程为何耗时如此之长,这是一个资源瓶颈还是仅仅是它正在处理的数据量,需要进行更多的调查:)死机是什么意思?IdleAlso由于这是一个数据上传过程,而且您可能一次处理大量数据,因此我建议您使用适当的工具,例如
SSIS(Sql Server Integration Services)
。啊,好吧,很遗憾,Sql Server不会记录任何您以后可能用于诊断问题的内容,除非您正在运行SQL跟踪,否则您可以通过使用
sp_whoisActive(由Adam Machanic编写)
或简单使用
sp_who2
检查SQL服务器上进程的任何阻塞或进程,来查看出错的地方。至少在
尝试的地方。。。catch
无法捕获错误。我想这些都会出现在SQL Server日志中,但可能是什么原因造成的?评论不错,谢谢。没错,此存储过程正由ASP.Net应用程序的后台线程调用,但超时时间为5小时。对于大型数据集,SP将在1小时内死亡,因此我认为这不是超时问题。我个人认为这是内存问题,SQL Server被要求一次收集太多数据,但我的问题是,
select * from sys.processes