Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

FIX: résultats incorrects si vous utilisez des parenthèses autour de SELECT dans une instruction contenant une expression de table commune dans SQL Server 2008

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 2322209
Symptômes
Sur un ordinateur qui exécute Microsoft SQL Server 2008, prendre en compte les scénarios suivants.

Scénario 1

Vous spécifiez une expression de table communes (CTE) à l'aide de l'instruction WITH. Par exemple, vous exécuter 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 des valeurs de statement_start_offset et statement_end_offset incorrects. Plus précisément, vous notez la valeur de statement_end_offset est inférieure à la valeur statement_start_offset lors de l'exécution de la vue de gestion dynamique sys.dm_exec_query_stats (DMV).

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

Vous spécifiez une expression de table commune à l'aide de l'instruction WITH, et que vous utilisez l'option RECOMPILE. Par exemple, vous créez une fonction dans SQL Server 2008 à l'aide du 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électionnez dbo.function1() ”, le message d'erreur suivant :
une grave erreur s'est produite sur la commande actuelle. Les résultats, le cas échéant, doivent être ignorés.

En outre, cette erreur peut se produire sans l'option RECOMPILE si le serveur SQL server connaît le trafic du serveur lourd.

Scénario 3

Vous spécifiez une expression de table commune à l'aide de l'instruction WITH. Dans l'instruction WITH, vous spécifiez une table qui n'existe pas. Par exemple, vous exécuter 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'une erreur pour la table manquante.
Cause
Ces problèmes se produisent en raison d'un traitement d'une instruction SELECT qui suit une expression WITH ne fonctionne pas correctement. L'instruction WITH utilise la syntaxe suivante.
WITH common_table_expression AS(CTE_query_definition)
Cette instruction puis crée un jeu de résultats qui est affecté au nom du common table expression qui a été spécifié. Vous suivez cette instruction avec une instruction SELECT. Si cette seconde instruction est placée entre parenthèses et vous essayez d'effectuer une opération sur les résultats, ou 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
Ces problèmes ont été résolus dans le CTP SQL Server 2008 Service Pack 2. Téléchargez et installez la dernière version SQL Server 2008 service pack.
968382Comment faire pour obtenir le dernier service pack pour SQL Server 2008
Possible de télécharger le CTP du SQL Server 2008 Service Pack 2 directement à partir du centre de téléchargement Microsoft :
Contournement
Pour contourner ces problèmes, vous devez supprimer les parenthèses de l'instruction qui suit l'expression de table commune. Par exemple, considérez les éléments suivants avec l'instruction qui utilise ce type entre parenthèses.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Pour contourner ces problèmes, remplacez par la suivante avec l'instruction qui n'utilise pas ces parenthèses.
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 dans les produits Microsoft répertoriés dans la section «S'applique à».
Plus d'informations
Pour plus d'informations sur l'utilisation de l'instruction WITH dans une expression de table courantes, consultez la page de Web MSDN suivant :Pour plus d'informations sur sys.dm_exec_query_stats, visitez la page de Web MSDN suivant :
SQL cte code requête

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 2322209 - Dernière mise à jour : 08/31/2010 20:35:00 - Révision : 1.0

Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup

  • kbqfe kbfix kbexpertiseadvanced kbsurveynew kbtshoot kbquery kbmt KB2322209 KbMtfr
Commentaires
: none; " src="https://c1.microsoft.com/c.gif?DI=4050&did=1&t=">tml>amp;did=1&t=">