SQL Server 2005 et portée de la table temporaire
J'ai lu autour du sujet des tables temporaires et de la portée et toutes les réponses que j'ai vues ne semblent pas parler d'une de mes préoccupations.
Je comprends que la portée d'une table temporaire locale n'est valide que pour la durée de vie d'une procédure stockée ou de procédures stockées enfants. Cependant, quelle est la situation en ce qui concerne la concurence. c'est-à-dire si j'ai une procédure stockée qui crée une table temporaire appelée à partir de deux processus différents mais à partir de la même chaîne utilisateur / Connexion, sera que temporaire table partagée entre les deux appels à une procédure stockée ou d'un cas de chaque appel de la procédure stockée crée une unique table temporaire instance.
Je suppose que la table temporaire appartient à la portée de l'appel au procdure stocké mais je veux être sûr avant de suivre un chemin avec ceci.
4 réponses
Les tables temporaires locales (commencent par#) sont limitées à votre session; les autres sessions, même de la même chaîne utilisateur / connexion, ne peuvent pas les voir. Les règles pour la durée de vie dépendent de la création ou non de la table temporaire locale dans une procédure stockée:
- une table temporaire locale créée dans une procédure stockée est supprimée à la fin de la procédure; les autres procédures stockées, ou le processus appelant, ne peuvent pas les voir.
- les autres tables temporaires locales sont supprimées lorsque la fin de la session.
Tables temporaires Globales (commençant par ##) sont partagées entre les sessions. Ils sont supprimés lorsque:
- la session qui les a créés se termine
- et aucune autre session ne se réfère à eux
Cette commande peut être utile pour voir quelles tables temporaires existent:
select TABLE_NAME from tempdb.information_schema.tables
Et ceci est pratique pour supprimer des tables temporaires si vous n'êtes pas sûr qu'elles existent:
if object_id('tempdb..#SoTest') is not null drop table #SoTest
Voir cet article MSDN pour plus d'informations.
La table temporaire sera accessible à l'instance de la procédure qui le crée
Le script suivant
Exec ('Select 1 as col Into #Temp Select * From #Temp')
Exec ('Select 2 as col Into #Temp Select * From #Temp')
Renvoie
Col
1
Col
2
Pas
Col
1
2
Ou une erreur car la table existe déjà.
La table temporaire sera également accessible par toutes les procédures "enfants" que la procédure initiale exécute également.
L'article suivant pourrait aider: "Comment partager des données entre les procédures stockées" http://www.sommarskog.se/share_data.html
Vous pourriez également penser à utiliser des variables de table. Ils ont une portée très bien définie, et ils sont parfois plus rapides que leurs homologues de table temporaires. Le seul problème avec les variables de table est qu'elles ne peuvent pas être indexées, donc certaines performances peuvent être perdues malgré leur nature. Vérifiez ici pour plus d'informations sur le sujet.