CORRECTIF : L'exécution simultanée de procédure stockée qui RECOMPILE peut échouer exécuter toutes les instructions

Traductions disponibles Traductions disponibles
Numéro d'article: 250506 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
BOGUE : 55251 (SQLBUG_70)
Agrandir tout | Réduire tout

Symptômes

Une procédure stockée peut échouer en silence exécuter toutes les instructions qu'il contient si les conditions suivantes sont remplies :

  • Plusieurs connexions sont exécutent simultanément la même procédure.

  • Une référence est faite à une table temporaire créée à l'extérieur de cette procédure.

  • Une ou plusieurs instructions peuvent également provoquer la recompilation (potentiellement déclenchée par «auto update statistics») faites suivre la référence à cette table temporaire.
Toutes les instructions peuvent exécuter pour certains utilisateurs exécutant la procédure, tandis que d'autres ne.

Contournement

Créer la procédure avec la clause WITH RECOMPILE ou utilisez la clause WITH RECOMPILE l'exécution de la procédure.

Statut

Microsoft a confirmé l'existence de ce problème dans SQL Server 7.0. Ce problème a été corrigé dans le Service Pack 2 US pour Microsoft SQL Server 7.0. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
254561INF: Comment faire pour obtenir le Service Pack 2 pour Microsoft SQL Server 7.0 et Microsoft Data Engine (MSDE) 1.0
Pour plus d'informations, contactez votre support technique.

Plus d'informations

Si une référence est faite à une table temporaire créée à l'extérieur de la procédure en cours, qu'instruction et toutes les instructions suivantes ne peuvent pas être compilées lorsque la procédure est exécutée en premier. Cela est dû au fait qu'aucune information n'est connue sur le schéma de la table. Une fois l'exécution atteint cette instruction et les valeurs de schéma et de la cardinalité sont disponibles, la procédure est recompilée à l'aide de ces informations. Pour minimiser les temps de compilation, SQL Server effectue une «compilation partielle» dans ce cas et génère uniquement un plan de requête pour les instructions à celle-ci.

Puisque plusieurs utilisateurs peuvent partager un plan compilé, SQL Server 7.0 sérialise recompilations pour faire en sorte que seule une des connexions fonctionne la recompilation. Si vous devez également recompiler les autres connexions, ils attendent sur la première connexion pour terminer sa recompilation et de reprendre l'exécution à leur prochaine étape.

Si vous rencontrez une situation où deux connexions se trouvent à différents stades de l'exécution et celui qui déclenche la recompilation est tout d'abord avant la référence à la table temporaire créée à l'extérieur de la procédure, il arrêtera la compilation d'un plan lorsqu'il atteint cette instruction. Si une seconde connexion se situe après cela et déclenche également une recompilation lors de la compilation de la première connexion, il reprend l'exécution et incorrectement pense qu'il a exécuté toutes les instructions dans le plan.

Si vous utilisez WITH RECOMPILE, lors de création de la procédure ou lorsqu'il est exécuté, les deux connexions jamais partagent le même plan compilé et ne rencontre jamais de cette condition.

Dans la mesure du possible, il est également conseillé de référencer une table temporaire créée à l'extérieur de la procédure en cours, car elle requiert toujours une recompilation de la procédure. Vous trouverez les autres méthodes de programmation pour les procédures stockées sous la rubrique «Conseils pour Transact-SQL» dans la documentation en ligne de SQL.

Pour déterminer qu'une procédure est en cours recompilée, vous pouvez les visualiser avec l'événement SP: Recompile dans le Générateur de profils SQL.

Propriétés

Numéro d'article: 250506 - Dernière mise à jour: samedi 1 février 2014 - Version: 2.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 7.0 Standard
Mots-clés : 
kbnosurvey kbarchive kbmt kbbug kbfix KB250506 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: 250506
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.

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