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

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
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
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 T1GOCREATE TABLE T1(  C1  NCHAR(1)  )SET NOCOUNT ONINSERT 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 C1SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1SELECT @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 <> @Str2BEGIN   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 OFFENDSET NOCOUNT OFFDROP TABLE T1				
indefinido especificação ANSI

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 287515 - Última Revisão: 12/06/2015 00:18:47 - Revisão: 3.2

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition

  • kbnosurvey kbarchive kbmt kbcodesnippet kbprb KB287515 KbMtpt
Comentários