Al momento sei offline in attesa che la connessione Internet venga ristabilita

PRB: Piano di esecuzione e i risultati di query di aggregazione concatenazione basa al percorso di Expression

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 287515
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Potrebbero verificarsi risultati imprevisti quando si applica né gli operatori di espressioni nella clausola ORDER BY di query di aggregazione concatenazione. I risultati della query di aggregazione di concatenazione in Microsoft SQL Server dipendono o meno in cui le espressioni di Transact-SQL vengono applicate a colonne della clausola ORDER BY della query. Per ulteriori informazioni o per visualizzare un esempio di una query di aggregazione di concatenazione e il comportamento anomalo, fare riferimento alla sezione "Informazioni" di questo articolo.
Cause
Il comportamento corretto per una query di aggregazione concatenazione non è definito.

Un'analisi dell'output SHOWPLAN della query si rivela che il processore di query di SQL Server crea un piano di esecuzione diversi quando le espressioni vengono applicate alle colonne clausola ORDER BY della query, rispetto a quando le espressioni stesse vengono applicate alle colonne in elenco SELECT della query. La decisione effettuata da query processor si basa sul costo dei piani di esecuzione possibili.

La specifica ANSI SQL-92 richiede che tutte le colonne a cui fa riferimento una clausola ORDER BY corrispondano ai set di risultati, definito dalle colonne presente nell'elenco SELECT. Quando un'espressione viene applicata a un membro di una clausola ORDER BY, tale colonna risultante non è esposta nella lista SELECT, causando un comportamento indefinito.

Inoltre, le specifiche ANSI relative a come deve essere applicata una clausola ORDER BY di stato che l'effetto di ORDER BY deve essere lo stesso come se richiedere set di risultati intero prodotto da nell'elenco SELECT e quindi eseguire l'ordinamento della tabella in base a tali colonne nell'elenco SELECT.
Workaround
Per ottenere i risultati previsti da una query di aggregazione di concatenazione, applicare qualsiasi espressione di funzione Transact-SQL o alle colonne in elenco SELECT anziché la clausola ORDER BY.
Informazioni
Una query di aggregazione concatenazione è una query che combina i valori di più righe in un'unica riga.

Procedura per riprodurre il problema

Utilizzare lo script di Transact-SQL riportato di seguito per riprodurre il problema.

Nota l'applicazione di funzioni LTRIM e RTRIM alla colonna della clausola ORDER BY e nell'elenco SELECT [C1].
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				
non definito specifica ANSI

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 287515 - Ultima revisione: 12/06/2015 00:18:43 - Revisione: 3.2

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

  • kbnosurvey kbarchive kbmt kbcodesnippet kbprb KB287515 KbMtit
Feedback