FIX: 并发执行的存储过程的重新编译为执行所有的语句可能失败

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

250506
本文已归档。它按“原样”提供,并且不再更新。
错误 #: 55251 (sqlbug_70)
症状
存储的过程以静默方式可能无法执行满足以下条件时,其中包含的所有语句:

  • 多个连接都同时执行同一个过程。

  • 此过程的外部创建一个临时表是对进行引用。

  • 也可能导致 (可能触发通过自动更新统计信息) 的重新编译的一个或多个语句按照对此临时表引用。
对于某些用户运行该过程中,而其他失败,可以执行所有语句。
替代方法
用带重新编译子句创建过程或执行过程时使用 WITH 重新编译子句。
状态
Microsoft 已经确认这是 SQL Server 7.0 中的问题。此问题已得到纠正在美国 Service Pack 2 中,对于 Microsoft SQL Server 7.0。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
254561INF: 如何获得有关 Microsoft SQL Server 7.0 和 Microsoft 数据引擎 (MSDE) 1.0 的 Service Pack 2
有关更多的信息,请联系您的主要支持提供者。
更多信息
如果引用对当前过程外创建一个临时表的语句和任何后续的语句可以不进行编译时第一次执行该过程。这是因为没有信息称为表的架构有关。一旦执行到达该语句,并架构和基数值均可用该过程是重新编译使用这些信息。在编译时最小化,SQL Server 执行一个"分部编译"在这种情况下,只生成为达此语句的查询计划。

由于多个用户可以共享一个已编译的计划,SQL Server 7.0 序列化以确保仅有一个连接执行了重新编译重新编译。如果其它连接还需要重新编译,它们等待完成其重新编译,然后继续在其下一个步骤的执行在第一个连接上。

如果您会遇到这样一个情况,其中两个连接都执行的各个阶段,在重新编译将触发的第一次是到临时表创建过程的外部引用之前,将停止到达该语句时编译的计划。如果第二个连接位于之后,并且第一个连接编译时还将触发一个重新编译,它继续执行,并错误地认为它已经执行计划中的所有语句。

如果您使用 WITH 重新编译,创建该过程时或执行它时这两个连接永远不会共享相同的已编译的计划和将永远不会遇到这种情况。

在可能的情况下,建议还不到引用创建在当前过程以外的一个临时表,因为它总是要求的过程的重新编译。其他的存储过程的编程做法可以找到"TRANSACT-SQL 提示"主题下,SQL 联机丛书中。

若要确定当一个过程正在重新编译,您可以在观看 SP:Recompile 事件,在 SQL 事件探查器。
编译未完成部分的存储过程

Warning: This article has been translated automatically

属性

文章 ID:250506 - 上次审阅时间:10/20/2013 16:54:33 - 修订版本: 2.0

  • Microsoft SQL Server 7.0 标准版
  • kbnosurvey kbarchive kbmt kbbug kbfix KB250506 KbMtzh
反馈