KB2322209: corrección de los resultados incorrectos si utiliza paréntesis en una instrucción que tiene una expresión de tabla común en SQL Server 2008


Síntomas


En un equipo que ejecuta Microsoft SQL Server 2008, tenga en cuenta los siguientes escenarios.

Situación 1

Para especificar una expresión de tabla común (CTE), use la instrucción WITH. Por ejemplo, ejecute la consulta siguiente.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Después ejecuta esta consulta.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
En este escenario, el plan de consulta en caché de esta consulta almacena valores incorrectos de statement_start_offset y statement_end_offset. En concreto, observa que el valor de statement_end_offset es menor que el valor de statement_start_offset cuando ejecuta sys.dm_exec_query_stats vista de administración dinámica (DMV). Debido a este problema, se puede producir un error en un informe de rendimiento cuando el informe supone que el valor de statement_start_offset es siempre menor que el valor de statement_stop_offset.

Situación 2

Especifique una expresión de tabla común con la instrucción WITH y use la opción recompilar. Por ejemplo, se crea una función en SQL Server 2008 mediante la siguiente secuencia de comandos.
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
Cuando ejecuta una consulta "Select DBO. función1 ()", recibe el siguiente mensaje de error:
Se ha producido un error grave en el comando actual. Los resultados, si los hay, se deben descartar.
Además, este error puede producirse sin la opción recompilar si SQL Server experimenta un tráfico de servidor intenso.

Escenario 3

Para especificar una expresión de tabla común, use la instrucción WITH. En la instrucción WITH, se especifica una tabla que no existe. Por ejemplo, ejecute la consulta siguiente.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Al ejecutar esta consulta, no recibe un error para la tabla que falta.

Causa


Estos problemas se producen debido a un mal funcionamiento de una instrucción SELECT que sigue a una instrucción WITH. La instrucción WITH utiliza la sintaxis siguiente.
WITH common_table_expression AS(CTE_query_definition)
A continuación, esta instrucción crea un conjunto de resultados que se asigna al nombre de la expresión de tabla común que se especificó. Después, sigue esta instrucción con una instrucción SELECT. Si la segunda instrucción está entre paréntesis y, a continuación, intenta realizar una operación sobre los resultados o intenta ejecutar una vista de administración dinámica de sys.dm_exec_query_stats, recibirá resultados incorrectos o un error.

Resolución


Información de Service Pack Para resolver este problema, obtenga el Service Pack más reciente para SQL Server 2008. Si desea obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
968382 Cómo obtener el Service Pack más reciente para SQL Server 2008

Solución alternativa


Para evitar estos problemas, debe quitar los paréntesis de la instrucción que sigue a la expresión de tabla común. Por ejemplo, considere la siguiente instrucción WITH que usa estos paréntesis.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Para evitar estos problemas, cambie a la instrucción WITH siguiente que no use estos paréntesis.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "se aplica a". Este problema se corrigió por primera vez en SQL Server 2008 Service Pack 2 (SP2).

Más información


Para obtener más información sobre cómo usar la instrucción WITH con una expresión de tabla común, visite la siguiente página web de MSDN:Para obtener más información sobre sys.dm_exec_query_stats, visite la siguiente página web de MSDN: