FIX: risultati non corretti se si utilizzano parentesi SELECT in un'istruzione contenente un'espressione di tabella comune in SQL Server 2008

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

In questa pagina

Sintomi

In un computer che esegue SQL Server 2008, prendere in considerazione i seguenti scenari.

Scenario 1

Si specifica un'espressione di tabella comuni (CTE) utilizzando l'istruzione WITH. Ad esempio, eseguire la seguente query.
WITH common_table_expression AS 

(SELECT * FROM sys.objects)

(SELECT *

FROM common_table_expression)
Quindi eseguire la query.
SELECT *

FROM sys.dm_exec_query_stats

WHERE statement_start_offset > statement_end_offset

AND

statement_end_offset <> -1
In questo scenario, il piano di query memorizzati nella cache per questa query memorizza valori statement_start_offset e statement_end_offset errati. In particolare, si noterà che il valore statement_end_offset è minore del valore statement_start_offset quando si esegue sys.dm_exec_query_stats vista di gestione dinamica (DMV).

Causa del problema, un report di prestazioni potrebbe non riuscire quando il report si presuppone che il valore statement_start_offset è sempre inferiore a valore statement_stop_offset.

Scenario 2

Si specifica un'espressione di tabella comune utilizzando l'istruzione WITH e si utilizza l'opzione RECOMPILE. Ad esempio, creare una funzione in SQL Server 2008 utilizzando lo script seguente.
CREATE FUNCTION function1() RETURNS int AS
BEGIN
DECLARE @x int
SET @x=1;
WITH common_table_expression AS

(SELECT @x AS column1)

(SELECT @x=column1 FROM common_table_expression)

OPTION(RECOMPILE)
RETURN @x
END
Quando si esegue una query ? selezionare dbo.function1() ?, viene visualizzato il seguente messaggio di errore:
un grave errore durante il comando corrente. I risultati eventuali devono essere ignorati.

Inoltre, questo errore può verificarsi senza l'opzione RECOMPILE se SQL server si verifica traffico intenso del server.

Scenario 3

Si specifica un'espressione di tabella comune utilizzando l'istruzione WITH. Nell'istruzione WITH è possibile specificare una tabella che non esiste. Ad esempio, eseguire la seguente query.
WITH computed_table (id) AS
(SELECT id 
FROM this_table_does_not_exist) 
(SELECT id 
FROM dbo.computed_table) 
GO
Quando si esegue questa query non viene visualizzato un errore relativo alla tabella mancante.

Cause

Questi problemi si verificano a causa di una malfunzionamento l'elaborazione di un'istruzione SELECT che segue un'istruzione WITH. L'istruzione WITH viene utilizzata la seguente sintassi.
WITH common_table_expression AS

(CTE_query_definition)
Quindi questa istruzione crea un set di risultati viene assegnato il nome di espressione di tabella comune specificato. Seguire quindi questa istruzione con un'istruzione SELECT. Se la seconda istruzione è racchiuso tra parentesi e si tenta di eseguire un'operazione sui risultati o si tenta di eseguire una vista di gestione dinamica sys.dm_exec_query_stats, riceverai risultati errati o un errore.

Risoluzione

Questi problemi sono stati risolti nella CTP di SQL Server 2008 Service Pack 2. Scaricare e installare il più recente pacchetto di SQL Server 2008 service.
968382Come ottenere il service pack più recente per SQL Server 2008
Di SQL Server 2008 Service Pack 2 CTP può essere scaricato direttamente dall'area Download Microsoft:
CTP di SQL Server 2008 Service Pack 2

Workaround

Per risolvere questi problemi, è necessario rimuovere le parentesi dell'istruzione che segue l'espressione di tabella comune. Ad esempio, considerare i seguenti WITH istruzione che utilizza tali parentesi.
WITH common_table_expression AS 

(SELECT *
FROM sys.objects)

(SELECT *

FROM common_table_expression)
Per risolvere questi problemi, modificare il seguente WITH istruzione che non utilizza le parentesi.
WITH common_table_expression AS 

(SELECT *
FROM sys.objects)
SELECT *

FROM common_table_expressio

Status

Microsoft ha confermato che si tratta di un problema con i prodotti elencati nella sezione "Si applica a".

Informazioni

Per ulteriori informazioni su come utilizzare l'istruzione WITH con un'espressione di tabella comune, visitare la seguente pagina Web MSDN:
WITH common_table_expression (Transact-SQL)
Per ulteriori informazioni su sys.dm_exec_query_stats, visitare la seguente pagina Web MSDN:
sys.dm_exec_query_stats (Transact-SQL)

Proprietà

Identificativo articolo: 2322209 - Ultima modifica: martedì 31 agosto 2010 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
Chiavi: 
kbqfe kbfix kbexpertiseadvanced kbsurveynew kbtshoot kbquery kbmt KB2322209 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: 2322209
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