症状
当 Microsoft SQL Server 重复执行执行下列操作的存储过程时,可能会发生断言错误:
-
获取大型对象(如 varchar (max) 或 varbinary (max))作为参数,然后
-
创建一个属于过程执行范围的临时表,并
-
使用临时表中的大型对象参数。
你可能会在 SQL Server 错误日志中找到类似于以下内容的断言错误:
日期/时间 SPID错误:17065、严重级别:16、状态:1。
日期/时间 SPID SQL Server Assertion: File: FilePath \FileName,line = LineNumber 失败断言 = "fFalse" 尝试访问过期的 blob 句柄(1)。 此错误可能与计时有关。 如果再次运行该语句后,该错误仍然存在,请使用 DBCC CHECKDB 检查数据库的结构完整性,或者重新启动服务器以确保内存中的数据结构未损坏。
日期/时间 SPID错误:3624,严重性:20,状态:1。
日期/时间 SPID系统断言检查失败。有关详细信息,请查看 SQL Server 错误日志。通常,断言失败由软件错误或数据损坏导致。若要检查数据库是否损坏,请考虑运行 DBCC CHECKDB。如果你同意在安装期间将转储发送到 Microsoft,则会向 Microsoft 发送一个小转储。在来自 Microsoft 的最新服务包或来自技术支持的修补程序中,可能会提供更新。
原因
SQL Server 具有内部逻辑,用于禁用引用大型对象的查询的缓存,以便后续执行不会引用这些 Lob (这些 Lob 是在之前的运行期间创建的,因此对于后续的运行无效)。 该逻辑未处理导致这些计划缓存的临时表的 延迟名称解析(DNR)的大小写。 已确定范围的临时表的创建成本很高,SQL Server 将缓存这些表以便在后续执行中重复使用。 这可防止因架构更改而重新编译此类查询。
了解有关 延迟名称解析的详细信息。
解决方案
在 SQL Server 的以下累积更新中修复了此问题:
SQL Server 2014 的累积更新 10 Service Pack 2
SQL Server 的每个新的累积更新均包含上一版本中的所有修补程序和安全修补程序。 查看 SQL Server 的最新累积更新:
SQL Server 2014 的最新累积更新
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。
参考
了解 Microsoft 用于描述软件更新的 术语 。