使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

症状

在运行 Microsoft SQL Server 2008 的计算机上,请考虑以下方案。

情形 1

使用 WITH 语句指定一个公用表表达式(CTE)。 例如,运行以下查询。

WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)

然后,运行此查询。

SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1

在此方案中,此查询的缓存查询计划存储不正确的 statement_start_offset 和 statement_end_offset 值。 具体地说,你会发现,当你运行 sys.dm_exec_query_stats 动态管理视图(DMV)时,statement_end_offset 值小于 statement_start_offset 值。由于此问题,当报表假定 statement_start_offset 值始终小于 statement_stop_offset 值时,性能报告可能会失败。

情形 2

使用 WITH 语句指定一个公用表表达式,然后使用重新编译选项。 例如,你可以使用以下脚本在 SQL Server 2008 中创建函数。

CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND

当你运行 "select function1 ()" 查询时,将收到以下错误消息:

当前命令出现严重错误。 应丢弃结果(如果有)。

此外,如果 SQL server 遇到大量的服务器流量,则无需重新编译选项也会出现此错误。

情形 3

使用 WITH 语句指定一个公用表表达式。 在 WITH 语句中,指定一个不存在的表。 例如,运行以下查询。

WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO

运行此查询时,不会收到缺少的表的错误。

原因

出现这些问题的原因是处理 WITH 语句之后的 SELECT 语句出现故障。 WITH 语句使用以下语法。

WITH common_table_expression AS(CTE_query_definition)

然后,此语句将创建分配给指定的公用表表达式名称的结果集。 然后,使用 SELECT 语句跟踪此语句。 如果第二条语句括在括号中,然后你尝试对结果执行操作,或者尝试运行 sys.dm_exec_query_stats 的动态管理视图,则会收到错误的结果或错误。

解决方案

服务包信息 若要解决此问题,请获取最新的 SQL Server 2008 服务包。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

968382 如何获取最新的 SQL Server 2008 服务包

解决方法

若要解决这些问题,必须删除位于公用表表达式后面的语句中的括号。 例如,请考虑以下带有使用此类括号的语句。

WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)

若要解决这些问题,请改为以下 WITH 语句,不使用这些括号。

WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

状态

Microsoft 已确认这是 "适用于" 部分中列出的 Microsoft 产品中的问题。此问题首先在 SQL Server 2008 Service Pack 2 (SP2)中更正。

更多信息

有关如何将 WITH 语句与公用表表达式配合使用的详细信息,请访问以下 MSDN 网页:

通过 common_table_expression (Transact-sql)有关 sys.dm_exec_query_stats 的详细信息,请访问以下 MSDN 网页:

sys.dm_exec_query_stats (Transact-sql)

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×