在产品环境中定时执行SP时,偶尔会遇到SP执行失败的情况,SQL Server抛出的错误消息是:
Could not continue scan with NOLOCK due to data movement
从错误消息的字面意思上来理解,存储过程执行失败的原因,很有可能是:SQL Server正在对基础表进行全表扫描,表带有NOLOCK锁提示,在扫描的当前位置缺少一个或多个数据页。但是,缺失的数据页并不能说明数据库中存在损坏问题,此错误的根本原因是由于DML语句引起的页面拆分导致页面被删除或移动,在某一个时刻,数据库无法保证数据的一致性,导致SQL Server无法继续扫描操作。为了验证是否是数据页导致的,可以使用CHECKDB命令:
DBCC CHECKDB(MY_DATABASE) WITH PHYSICAL_ONLY
如果数据库出现故障,或者数据出现丢失,该命令会显示出详细的错误信息。
但是,通常情况下,出现数据库故障的情况非常少,因此,该命令通常不会返回任何错误消息。排除掉数据库故障这个错误之外,那么出现这种错误的原因,只有一个可能,那就是在堆表上执行SELECT命令的时候,使用了表提示(hint) with(nolock),同时有一个up