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

Traduzione articoli Traduzione articoli
Identificativo articolo: 287515 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

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 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
				

Proprietà

Identificativo articolo: 287515 - Ultima modifica: giovedì 16 ottobre 2003 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Chiavi: 
kbmt kbcodesnippet kbprb KB287515 KbMtit
Traduzione automatica articoli
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
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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