KB960770 - 修复:运行将数据插入 SQL Server 临时表的查询时收到错误 605 和错误 824

应用对象
SQL Server 2008 Service Pack 3

Bug:#50003826 (SQL 修补程序)

Microsoft 将 Microsoft SQL Server 2008 修复程序作为一个可下载的文件分发。 由于修补程序是累积的,因此每个新版本都包含之前 SQL Server 2008 修补程序版本中包含的所有修补程序和安全修补程序。

症状

在 SQL Server 2008 中,运行一个将数据插入临时表的查询。 insert 语句包含引用同一临时表的子查询。 运行查询时,你可能会收到类似以下内容的错误消息:

注意

消息 605,级别 21,状态 3,第 1 行

尝试在数据库 2 中提取逻辑页 (1:225) 失败。 它属于分配单元281474980315136不属于504403158513025024。

如果再次运行该查询,你将收到类似如下内容的错误消息:

注意

        

  • 消息 824,级别 24,状态 2,第 1 行
  • SQL Server检测到基于逻辑一致性的 I/O 错误:校验和不正确 (预期:0x50758180;实际:0x15658bfc) 。 它在读取数据库 ID 2 中的第 (页 1:336) 文件“C:\Program Files\Microsoft SQL Server\MSSQL10”中的偏移0x000000002a0000期间发生。SQL2008\MSSQL\DATA\tempdb.mdf“。 SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。 这是一种严重的错误情况,威胁到数据库完整性,必须立即更正。 完成完整的数据库一致性检查 (DBCC CHECKDB) 。 此错误可能由多种因素引起;有关详细信息,请参阅 SQL Server 联机丛书。

在某些情况下,可能还会收到类似以下内容的错误消息:

注意

消息 601,级别 12,状态 3,过程 p程序名称,行 号
由于数据移动,无法继续使用 NOLOCK 进行扫描。

可能产生这些错误的查询构造如下所示:

insert #table1
select s.col1, s.col2
from #table2 s inner loop join #table1 t 
on s.col3 = t.col3 

      

解决方法

此问题的修补程序已在累积更新 3 中首次发布。 有关如何获取 SQL Server 2008 的此累积更新程序包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

960484 2008 SQL Server累积更新包 3注意 由于版本是累积的,因此每个新的修补程序版本都包含之前 SQL Server 2008 修补程序版本中包含的所有修补程序和所有安全修补程序。 建议应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

956909 2008 SQL Server 发布之后发布的 SQL Server 2008 内部版本安装此累积更新包后,必须启用跟踪标志 4135。 为此,可以添加 -T4135 启动参数。 或者,可以对特定会话使用 dbcc traceon (4135) 语句。

解决方法

要解决此问题,请向临时表添加同时具有群集主键和标识属性的列。 例如,运行以下语句来更改临时表:

ALTER TABLE #TempTable
ADD id integer IDENTITY(1,1) CONSTRAINT id PRIMARY KEY CLUSTERED

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

详细信息

虽然遇到错误消息 824 或 605,但数据库并未损坏。 此外,这些错误消息引用 tempdb 数据库中的页面。

有关更改的文件的详细信息,以及应用包含此 Microsoft 知识库文章中所述的修补程序的累积更新包的任何先决条件的信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

960484 SQL Server 2008 累积更新包 3

SQL Server 2008 R2 BPA 信息

SQL Server 2008 R2 Best Practice Analyzer (SQL Server 2008 R2 BPA) 提供了一个规则来检测未启用累积更新或未启用跟踪标志来解决此问题的情况。 SQL Server 2008 R2 BPA 同时支持 SQL Server 2008 和 SQL Server 2008 R2。

如果运行 BPA 工具并遇到“数据库引擎 - tempdb 错误修复或跟踪标志缺失”警告,则必须检查 SQL Server 的版本以及配置为启用此修补程序的跟踪标志。

参考资料

规则软件 规则标题 规则标识符
SQL Server 2008 R2 BPA 规则 tempdb 错误修复或跟踪标志缺失 RID3808

注意:可以启用跟踪标志 4135 或跟踪标志 4199 来启用此修补程序。 跟踪标志 4135 是在 SQL Server 2008 的累积更新包 3 中引入的。 跟踪标志 4135 也适用于 SQL Server 2008 Service Pack 1、SQL Server 2008 Service Pack 2 和 SQL Server 2008 R2。 跟踪标志 4199 在 SQL Server 2008 的累积更新包 7、SQL Server 2008 Service Pack 1 的累积更新包 7 和 SQL Server 2008 R2 的累积更新包 1 中引入。 有关跟踪标志 4199 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

添加了974006 跟踪标志 4199 以控制以前在多个跟踪标志下进行的多个查询优化器更改 由于此问题的修复涉及特定修补程序版本和启用修补程序的跟踪标志的组合,因此我们将下表列为显示不同的方案以及针对每个方案建议采取的操作。

SQL Server 生成和跟踪标志更新建议

  有关最新 SQL Server 版本的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

957826 在何处查找有关最新SQL Server版本的信息

参考资料

有关 SQL Server 2008 发布之后可用的内部版本列表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

956909 在 SQL Server 2008 发布之后发布的 SQL Server 2008 内部版本

有关 SQL Server 增量服务模型的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

935897 可从 SQL Server 团队获取增量服务模型以提供可以解决所报告问题的修补程序

有关 SQL Server 更新的命名架构的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

822499 Microsoft SQL Server 软件更新包的新命名模式有关软件更新术语的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

824684 用于描述Microsoft软件更新的标准术语说明