Sintomi
In un computer che sta eseguendo Microsoft SQL Server 2008, considerare gli scenari seguenti.
Scenario 1
Per specificare un'espressione di tabella comune (CTE), usare l'istruzione WITH. Ad esempio, Esegui la query seguente.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Esegui quindi questa query.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
In questo scenario, il piano di query memorizzato nella cache per la query archivia i valori statement_start_offset e statement_end_offset non corretti. In particolare, si nota che il valore statement_end_offset è minore del valore di statement_start_offset quando si esegue sys.dm_exec_query_stats DMV (Dynamic Management View). A causa di questo problema, un report di prestazioni potrebbe non riuscire quando il report presuppone che il valore statement_start_offset sia sempre inferiore al valore statement_stop_offset.
Scenario 2
È possibile specificare un'espressione di tabella comune usando l'istruzione WITH e si usa l'opzione RECOMPILE. Ad esempio, è possibile creare una funzione in SQL Server 2008 usando lo script seguente.
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
Quando si esegue una query "SELECT dbo. funzione1 ()", viene visualizzato il messaggio di errore seguente:
Si è verificato un grave errore nel comando corrente. I risultati, se presenti, devono essere eliminati.
Questo errore può inoltre verificarsi senza l'opzione di ricompilazione se SQL Server sta verificando il traffico pesante del server.
Scenario 3
Per specificare un'espressione di tabella comune, è possibile usare l'istruzione WITH. Nell'istruzione WITH si specifica una tabella che non esiste. Ad esempio, Esegui la query seguente.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Quando si esegue la query, non viene visualizzato un messaggio di errore per la tabella mancante.
Causa
Questi problemi si verificano a causa di un'elaborazione malfunzionante di un'istruzione SELECT che segue un'istruzione WITH. L'istruzione WITH usa la sintassi seguente.
WITH common_table_expression AS(CTE_query_definition)
Questa istruzione crea quindi un set di risultati assegnato al nome dell'espressione di tabella comune specificato. Quindi, segui questa istruzione con un'istruzione SELECT. Se questa seconda istruzione è racchiusa tra parentesi e si prova a eseguire un'operazione sui risultati oppure si prova a eseguire una sys.dm_exec_query_stats visualizzazione a gestione dinamica, si riceveranno risultati non corretti o un errore.
Risoluzione
Informazioni sui Service Pack Per risolvere il problema, ottenere il Service Pack più recente per SQL Server 2008. Per ulteriori informazioni, fare clic sul numero dell'articolo seguente per visualizzare l'articolo nella Microsoft Knowledge Base:
968382 Come ottenere il Service Pack più recente per SQL Server 2008
Soluzione alternativa
Per risolvere questi problemi, è necessario rimuovere le parentesi dall'istruzione che segue l'espressione di tabella comune. Ad esempio, considera l'istruzione seguente WITH che usa tali parentesi.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Per aggirare questi problemi, passare alla seguente istruzione WITH che non usa queste parentesi.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Stato
Microsoft ha confermato che si tratta di un problema nei prodotti Microsoft elencati nella sezione "si applica a". Questo problema è stato risolto per la prima volta in SQL Server 2008 Service Pack 2 (SP2).
Ulteriori informazioni
Per altre informazioni su come usare l'istruzione WITH con un'espressione di tabella comune, visitare la pagina Web MSDN seguente:
CON common_table_expression (Transact-SQL)Per altre informazioni su sys.dm_exec_query_stats, visitare la pagina Web MSDN seguente: