CORRIGER : Le plan de requête pour une procédure stockée n'est pas mis en cache si la procédure stockée utilise une variable d’objet BLOB et si la variable est utilisée dans une fonction de chaîne dans Microsoft SQL Server 2008 ou Microsoft SQL Server 2008 R2

S’applique à : SQL Server 2008SQL Server 2008 R2

Microsoft distribue Microsoft SQL Server 2008 et les correctifs de Microsoft SQL Server 2008 R2 en tant que fichier téléchargeable. Les correctifs étant cumulatifs, chaque nouvelle version contient tous les correctifs et correctifs de sécurité inclus dans la précédente SQL Server 2008 ou SQL Server 2008 R2 version du correctif.

Symptômes


Prenons l’exemple du scénario suivant :
  • Vous créez une procédure stockée dans Microsoft SQL Server 2008 ou Microsoft SQL Server 2008 R2.
  • La procédure stockée utilise une variable d’objet binaire volumineux (BLOB).
  • La variable d’objet BLOB est utilisée dans une fonction de chaîne.
  • Vous exécutez la procédure stockée.
Dans ce scénario, le plan de requête pour la procédure stockée n’est pas mis en cache.

Résolution


Informations sur les mises à jour cumulatives

SQL Server 2008 Service Pack 1

Le correctif de ce problème a été publié dans 10 de mise à jour Cumulative pour SQL Server 2008 Service Pack 1. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
2279604 Package de mise à jour cumulative 10 de SQL Server 2008 Service Pack 1
Remarque Les versions étant cumulatives, chaque nouvelle version du correctif contient tous les correctifs et correctifs de sécurité inclus dans la précédente version du correctif de SQL Server 2008. Microsoft vous recommande l’application la plus récente version du correctif qui comprendra ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
970365 Le 2008 de SQL Server versions publiées après SQL Server 2008 Service Pack 1
Les correctifs Microsoft SQL Server 2008 sont créés pour les packs de service spécifiques de SQL Server. Vous devez appliquer un correctif SQL Server 2008 Service Pack 1 dans une installation de SQL Server 2008 Service Pack 1. Par défaut, tout correctif qui est fourni dans un service pack de SQL Server est inclus dans le prochain service pack de SQL Server.

SQL Server 2008 Service Pack 2

Le correctif de ce problème a été publié dans à jour Cumulative 1 pour SQL Server 2008 Service Pack 2. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
2289254 Mise à jour cumulative 1 pour SQL Server 2008 Service Pack 2
Remarque Les versions étant cumulatives, chaque nouvelle version du correctif contient tous les correctifs et correctifs de sécurité inclus dans la précédente version du correctif de SQL Server 2008. Nous vous recommandons l’application la plus récente version du correctif qui comprendra ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2402659 Versions de la mise SQL Server 2008 publiées après SQL Server 2008 Service Pack 2 a été

SQL Server 2008 R2

Le correctif de ce problème a été publié dans les 4 mise à jour Cumulative. Pour plus d’informations sur l’obtention de ce package de mise à jour cumulative pour SQL Server 2008 R2, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
2345451 Mise à jour cumulative 4 pour SQL Server 2008 R2
Remarque Les versions étant cumulatives, chaque nouvelle version de correctif contient tous les correctifs et correctifs de sécurité inclus dans la précédente version du correctif de SQL Server 2008 R2. Nous vous recommandons l’application la plus récente version du correctif qui comprendra ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
981356 Versions de SQL Server 2008 R2 publiées après SQL Server 2008 R2

Statut


Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.

Informations supplémentaires


Pour reproduire ce problème, procédez comme suit :
  1. Exécutez le code suivant pour créer deux des procédures stockées (« p_test1 » et « p_test2 »). « P_test1 » utilise une variable d’objet BLOB, et « p_test2 » utilise une variable nvarchar(100).
    use tempdbgoif OBJECT_ID('p_test1') is not null drop proc p_test1if OBJECT_ID('p_test2') is not null drop proc p_test2gocreate proc p_test1@s nvarchar(max)asbeginselect * from sys.objects where name = UPPER(@s)endgocreate proc p_test2@s nvarchar(100)asbeginselect * from sys.objects where name = UPPER(@s)endgo 
  2. Exécutez le code suivant pour effacer le cache de procédure et de pour exécuter deux procédures stockées :
    dbcc freeproccachegoexec p_test1 N'abc'exec p_test2 N'abc'go 
  3. Exécutez le code suivant pour vérifier le plan mis en cache :
    select object_name(CONVERT(int, a.value)), cp.*from sys.dm_exec_cached_plans cpcross apply sys.dm_exec_plan_attributes(cp.plan_handle) awhere cp.objtype = 'Proc'and a.attribute = 'objectid' 
Remarque : S’il existe plusieurs exécutions simultanées de ce type de procédure stockée sur un 2008 de Microsoft SQL Server ou une instance de Microsoft SQL Server 2008 R2, vous pouvez rencontrer le blocage provoqué par des verrous de compilation de l’instance. Pour plus d’informations sur la description du blocage de SQL Server a provoqué par des verrous de compilation, consultez l’article suivant de la Base de connaissances Microsoft :
263889 Description du blocage de SQL Server a provoqué par des verrous de compilation

Références


Pour plus d’informations sur les fonctions de chaîne (Transact-SQL), visitez le site Web Microsoft suivant :Pour plus d’informations sur le modèle de service incrémentiel pour SQL Server, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
935897 Un modèle de service incrémentiel est disponible auprès de l’équipe SQL Server pour proposer des correctifs pour les problèmes signalés
Pour plus d’informations sur le schéma d’appellation des mises à jour de SQL Server, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
822499Nouveau schéma d’affectation de noms pour les packages de mise à jour logicielle de Microsoft SQL Server
Pour plus d'informations sur la terminologie de mise à jour logicielle, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
824684 Terminologie standard utilisée pour décrire les mises à jour logicielles Microsoft