PROBLEMA: Plano de execução e resultados de consultas de concatenação Aggregate dependem Expression local

Traduções deste artigo Traduções deste artigo
ID do artigo: 287515 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Você pode obter resultados inesperados quando você aplica qualquer operadores ou expressões a cláusula ORDER BY de consultas agregadas concatenação. Os resultados de consultas agregadas concatenação no Microsoft SQL Server dependem se ou não o Transact-SQL expressões são aplicadas para as colunas na cláusula ORDER BY da consulta. Para obter mais informações ou para ver um exemplo de uma consulta agregada concatenação e o comportamento apresentado, consulte a seção "Mais informações" deste artigo.

Causa

O comportamento correto para uma consulta agregada concatenação é indefinido.

Um exame da saída da consulta SHOWPLAN revela que o processador de consulta do SQL Server criará um plano de execução diferentes quando expressões são aplicadas às colunas cláusula ORDER BY da consulta, que quando as expressões mesmas são aplicadas a colunas na lista SELECT da consulta. A decisão tomada pelo processador de consulta se baseia o custo de planos de execução possível.

A especificação ANSI SQL-92 requer que qualquer coluna referenciada por uma cláusula ORDER BY corresponder ao conjunto de resultados, definido pelas colunas presentes na lista SELECT. Quando uma expressão é aplicada a um membro de uma cláusula ORDER BY, essa coluna resultante não é exposta na lista SELECT, resultando em comportamento indefinido.

Além disso, as especificações ANSI sobre como uma cláusula ORDER BY é a ser aplicado estado que o efeito de ORDER BY deve ser o mesmo como se você levar o conjunto de resultados inteiro produzido pela lista SELECT e, em seguida, executar a ordem da tabela com base nessas colunas na lista SELECT.

Como Contornar

Para obter os resultados esperados de uma consulta agregada concatenação, aplicar qualquer função Transact-SQL ou expressão para as colunas em lista SELECT em vez da cláusula ORDER BY.

Mais Informações

Uma consulta agregada concatenação é uma consulta que combina os valores de várias linhas em uma linha.

Etapas para reproduzir o problema

Use o seguinte script Transact-SQL para reproduzir o comportamento.

Observe a aplicação de funções LTRIM e RTRIM para a coluna [C1] na cláusula ORDER BY versus a 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
				

Propriedades

ID do artigo: 287515 - Última revisão: quinta-feira, 16 de outubro de 2003 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbmt kbcodesnippet kbprb KB287515 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 287515

Submeter comentários

 

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