DetailPage-MSS-KB

Base de Dados de Conhecimento

Artigo: 287515 - Última revisão: quinta-feira, 16 de Outubro de 2003 - Revisão: 3.2

 

Nesta página

Sintomas

Poderão ocorrer resultados inesperados quando aplicar qualquer operadores ou expressões à cláusula ORDER BY de consultas de agregação concatenação. Os resultados de consultas de agregação concatenação no Microsoft SQL Server dependem se Transact-SQL expressões são aplicadas as colunas na cláusula ORDER BY da consulta. Para mais informações ou para ver um exemplo de uma consulta de agregação concatenação e o comportamento apresentado, consulte a secção "Mais informação" deste artigo.

Causa

O comportamento correcto para uma consulta de agregação concatenação é indefinido.

Uma análise dos resultados da consulta SHOWPLAN revela que o processador de consultas do SQL Server cria um plano de execução diferentes quando expressões são aplicadas a coluna 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 feita o processador de consultas se baseia o custo de planos de execução possíveis.

A especificação do ANSI SQL-92 exige que qualquer coluna referenciada por uma cláusula ORDER BY corresponda 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 é apresentada na lista SELECT, resultando numa comportamento não definido.

Além disso, as especificações de ANSI relativamente a como uma cláusula ORDER BY deve ser aplicada indique que o efeito de ORDER BY deve ser o mesmo como se tirar o conjunto de resultado completo produzido pela lista SELECT e, em seguida, efectue a ordenação da tabela baseada nessas colunas numa lista SELECT.

Como contornar

Para obter os resultados esperados de uma consulta de agregação de concatenação, aplique qualquer função Transact-SQL ou expressão para as colunas na lista SELECT e não na cláusula ORDER BY.

Mais Informação

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

Passos para reproduzir o comportamento

Utilize o seguinte script de Transact-SQL para reproduzir o comportamento.

Tenha em atenção a aplicação das funções LTRIM e RTRIM na cláusula ORDER BY versus lista SELECT coluna [C1].
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
				

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áticaTraduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 287515  (http://support.microsoft.com/kb/287515/en-us/ )
Partilhar
Opções de suporte adicionais
Fóruns de Suporte da Comunidade Microsoft
Contacte-nos directamente
Encontre um parceiro certificado Microsoft
Loja Microsoft