KB2322209-FIX : résultats incorrects si vous utilisez des parenthèses pour sélectionner dans une instruction ayant une expression de table commune dans SQL Server 2008


Symptômes


Sur un ordinateur exécutant Microsoft SQL Server 2008, envisagez les scénarios suivants.

Scénario 1

Vous spécifiez une expression de table commune (CTE) à l’aide de l’instruction WITH. Par exemple, vous exécutez la requête suivante.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Ensuite, exécutez cette requête.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
Dans ce scénario, le plan de requête mis en cache pour cette requête stocke les valeurs incorrectes statement_start_offset et statement_end_offset. En particulier, vous remarquerez que la valeur statement_end_offset est inférieure à la valeur de la statement_start_offset lorsque vous exécutez sys.dm_exec_query_stats vue de gestion dynamique (DMV). En raison de ce problème, un rapport de performances peut échouer lorsque le rapport suppose que la valeur statement_start_offset est toujours inférieure à la valeur statement_stop_offset.

Scénario 2

POUR spécifier une expression de table commune, vous devez utiliser l’instruction WITH et utiliser l’option RECOMPILE. Par exemple, vous créez une fonction dans SQL Server 2008 en utilisant le script suivant.
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
Lorsque vous exécutez une requête « sélectionner dbo. fonction1 () », vous recevez le message d’erreur suivant :
Une erreur sérieuse s’est produite sur la commande actuelle. Les résultats éventuels doivent être supprimés.
Par ailleurs, cette erreur peut se produire sans l’option RECOMPILE si le serveur SQL rencontre du trafic serveur important.

Scénario 3

POUR spécifier une expression de table commune, vous devez utiliser l’instruction WITH. Dans l’instruction WITH, vous spécifiez une table qui n’existe pas. Par exemple, vous exécutez la requête suivante.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Lorsque vous exécutez cette requête, vous ne recevez pas d’erreur pour le tableau manquant.

Cause


Ces problèmes se produisent en raison d’un traitement défectueux d’une instruction SELECT qui suit une instruction WITH. L’instruction WITH utilise la syntaxe suivante.
WITH common_table_expression AS(CTE_query_definition)
Cette instruction crée ensuite un jeu de résultats attribué au nom de l’expression de table commune qui a été spécifié. Ensuite, vous devez suivre cette instruction par une instruction SELECT. Si cette deuxième instruction est entourée de parenthèses et que vous essayez d’effectuer une opération sur les résultats, ou si vous essayez d’exécuter une vue de gestion dynamique sys.dm_exec_query_stats, vous recevez des résultats incorrects ou une erreur.

Résolution


Informations sur le Service Pack Pour résoudre ce problème, procurez-vous le dernier Service Pack pour SQL Server 2008. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
968382 Obtention du dernier Service Pack pour SQL Server 2008

Solution de contournement


Pour contourner ces problèmes, vous devez supprimer les parenthèses de l’instruction qui suit l’expression de table commune. Par exemple, prenez en compte les affirmations suivantes utilisant une telle parenthèse.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Pour contourner ces problèmes, remplacez la valeur par une instruction WITH qui n’utilise pas les parenthèses ci-dessous.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Statut


Microsoft a confirmé qu’il s’agit d’un problème lié aux produits Microsoft répertoriés dans la section « s’applique à ». Ce problème a été corrigé pour la première fois dans SQL Server 2008 Service Pack 2 (SP2).

Informations supplémentaires


Pour plus d’informations sur l’utilisation de l’instruction WITH avec une expression de table commune, consultez la page Web MSDN suivante :Pour plus d’informations sur les sys.dm_exec_query_stats, consultez la page Web MSDN suivante :