FIX: resultados incorrectos si se utilizan paréntesis alrededor de SELECT en una instrucción que tiene una expresión de tabla común en SQL Server 2008

Seleccione idioma Seleccione idioma
Id. de artículo: 2322209 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

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

Escenario 1

Especifica una expresión de tabla comunes (CTE) mediante el uso de la instrucción WITH. Por ejemplo, ejecuta la consulta siguiente.
WITH common_table_expression AS 

(SELECT * FROM sys.objects)

(SELECT *

FROM common_table_expression)
A continuación, ejecute esta consulta.
SELECT *

FROM sys.dm_exec_query_stats

WHERE statement_start_offset > statement_end_offset

AND

statement_end_offset <> -1
En este escenario, el plan de consulta almacenado en caché para esta consulta almacena valores incorrectos de statement_start_offset y statement_end_offset. En concreto, observe el valor de statement_end_offset es menor que el valor de statement_start_offset al ejecutar Vista sys.dm_exec_query_stats de administración dinámica (DMV).

Debido a este problema, de un informe de rendimiento puede producir un error cuando el informe, se supone que el valor de statement_start_offset es siempre menor que el valor de statement_stop_offset.

Escenario 2

Especifica una expresión de tabla común con la instrucción WITH, y se utiliza la opción RECOMPILE. Por ejemplo, se crea una función de SQL Server 2008 mediante el uso de la siguiente script.
CREATE FUNCTION function1() RETURNS int AS
BEGIN
DECLARE @x int
SET @x=1;
WITH common_table_expression AS

(SELECT @x AS column1)

(SELECT @x=column1 FROM common_table_expression)

OPTION(RECOMPILE)
RETURN @x
END
Al ejecutar una consulta ? seleccione dbo.function1() ?, recibe el mensaje de error siguiente:
un error grave en el comando actual. Los resultados, si hay alguno, se deben descartar.

Además, este error puede producirse sin la opción RECOMPILE si el servidor SQL está experimentando el tráfico servidor intenso.

Escenario 3

Especifica una expresión de tabla común con la instrucción WITH. En la instrucción <a0>WITH</a0>, puede especificar una tabla que no existe. Por ejemplo, ejecuta 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 en la tabla que falta.

Causa

Estos problemas se producen debido a de mal funcionamiento de procesamiento 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)
En esta declaración, a continuación, se crea un conjunto de resultados que se asigna al nombre de expresión de tabla común que se ha especificado. A continuación, sigue esta instrucción con una instrucción SELECT. Si esta segunda instrucción se encuentra entre paréntesis y, a continuación, intenta realizar una operación en los resultados o intente ejecutar de una vista de administración dinámica sys.dm_exec_query_stats, recibe resultados incorrectos o un error.

Solución

Estos problemas se han resuelto en la CTP de SQL Server 2008 Service Pack 2. Descargue e instale la última SQL Server 2008 service pack.
968382Cómo obtener el service pack más reciente para SQL Server 2008
The SQL Server 2008 Service Pack 2 CTP se puede descargar directamente desde el centro de descarga de Microsoft:
CTP de SQL Server 2008 Service Pack 2

Solución

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 lo siguiente con la instrucción que utiliza este tipo entre paréntesis.
WITH common_table_expression AS 

(SELECT *
FROM sys.objects)

(SELECT *

FROM common_table_expression)
Para evitar estos problemas, cambie a la siguiente con la instrucción que no utiliza estas entre 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 enumerados en la sección "Se refiere a:".

Más información

Para obtener más información acerca de cómo utilizar la instrucción WITH con una expresión de tabla comunes, visite la página Web MSDN siguiente:
WITH common_table_expression (Transact-SQL)
Para obtener más información acerca de cómo sys.dm_exec_query_stats, visite la página Web MSDN siguiente:
sys.dm_exec_query_stats (Transact-SQL)

Propiedades

Id. de artículo: 2322209 - Última revisión: martes, 31 de agosto de 2010 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
Palabras clave: 
kbqfe kbfix kbexpertiseadvanced kbsurveynew kbtshoot kbquery kbmt KB2322209 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 2322209

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com