KB2322209-修复:如果在 SQL Server 2008 中具有公用表表达式的语句中,在 "SELECT" 中使用括号,则不正确的结果


症状


在运行 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 网页:有关 sys.dm_exec_query_stats 的详细信息,请访问以下 MSDN 网页: