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

Traductions disponibles Traductions disponibles
Numéro d'article: 2322209 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

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_stats

WHERE statement_start_offset > statement_end_offset

AND

statement_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 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
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 :
CTP SQL Server 2008 Service Pack 2

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 :
WITH common_table_expression (Transact-SQL)
Pour plus d'informations sur sys.dm_exec_query_stats, visitez la page de Web MSDN suivant :
sys.dm_exec_query_stats (Transact-SQL)

Propriétés

Numéro d'article: 2322209 - Dernière mise à jour: mardi 31 août 2010 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
Mots-clés : 
kbqfe kbfix kbexpertiseadvanced kbsurveynew kbtshoot kbquery kbmt KB2322209 KbMtfr
Traduction automatique
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
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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