PRB: Plan de ejecución y los resultados de consultas de agregado concatenación requiere en la ubicación de la expresión

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

En esta página

Síntomas

Puede experimentar resultados inesperados al aplicar operadores ni expresiones a la cláusula ORDER BY de consultas de agregado de concatenación. Los resultados de consultas de agregado de concatenación en Microsoft SQL Server dependen de si o no expresiones de Transact-SQL se aplicarán a las columnas de la cláusula ORDER BY de la consulta. Para obtener más información o para ver un ejemplo de una consulta de agregado de concatenación y el comportamiento demostrado, consulte la sección "Más información" de este artículo.

Causa

El comportamiento correcto para una consulta de agregado de concatenación es indefinido.

Un examen de la salida SHOWPLAN de la consulta revela que el procesador de consultas de SQL Server genera un plan de ejecución diferentes expresiones se aplican a las columnas en la cláusula de la consulta ORDER BY, que se aplican esas mismas expresiones a columnas de la lista SELECT de la consulta. La decisión realizada por el procesador de consultas se basa en el costo de planes de ejecución posibles.

La especificación de ANSI SQL-92 requiere que cualquier columna hace referencia a una cláusula ORDER BY coincide con el conjunto de resultados definido por las columnas presentes en la lista SELECT. Cuando una expresión se aplica a un miembro de una cláusula ORDER BY, esa columna resultante no se expone en la lista SELECT, dando como resultado un comportamiento indefinido.

Además, las especificaciones de ANSI relativas a cómo una cláusula ORDER BY es que se va a aplicar el estado que el efecto de ORDER BY debe ser el mismo como si toma el conjunto completo de resultados generado por la lista SELECT y, a continuación, realizar la ordenación de la tabla basándose en esas columnas en la lista SELECT.

Solución

Para lograr los resultados esperados de una consulta de agregado de concatenación, aplicar cualquier función Transact-SQL o una expresión a las columnas en la lista SELECT en lugar de en la cláusula ORDER BY.

Más información

Una consulta de agregado de concatenación es una consulta que combina los valores de varias filas en una fila.

Pasos para reproducir este comportamiento

Utilice la siguiente secuencia de comandos de Transact-SQL para reproducir el comportamiento.

Tenga en cuenta la aplicación de las funciones LTRIM y RTRIM a la columna [C1] en la cláusula ORDER BY frente a la lista SELECT.
IF EXISTS( SELECT * FROM sysobjects WHERE name = 'T1' )
	DROP TABLE T1
GO

CREATE TABLE T1(  C1  NCHAR(1)  )

SET NOCOUNT ON

INSERT T1 VALUES( 'A' )
INSERT T1 VALUES( 'B' )

DECLARE @Str0 VARCHAR(4) 
DECLARE @Str1 VARCHAR(4) 
DECLARE @Str2 VARCHAR(4) 

SET @Str0 = ''
SET @Str1 = ''
SET @Str2 = ''

SELECT @Str0 = @Str0 + C1 FROM T1 ORDER BY C1
SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )
SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1

SELECT @Str0 'No functions applied to column.'
SELECT @Str1 'LTRIM() and RTRIM() applied to ORDER BY clause.'
SELECT @Str2 'SELECT list with LTRIM(RTRIM()) (Workaround)'

IF @Str1 <> @Str2
BEGIN
   PRINT ''
   PRINT 'Execution plan depends on where the functions are applied:'
   PRINT '=========================================================='
   PRINT ''

   SET @Str1 = ''
   SET @Str2 = ''

   SET STATISTICS PROFILE ON
   SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )
   SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1
   SET STATISTICS PROFILE OFF
END

SET NOCOUNT OFF

DROP TABLE T1
				

Propiedades

Id. de artículo: 287515 - Última revisión: jueves, 16 de octubre de 2003 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbmt kbcodesnippet kbprb KB287515 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): 287515

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