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.

46
demandé sur GEOCHET 2009-05-21 14:56:03

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.

76
répondu Andomar 2009-05-21 11:42:56

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.

11
répondu Martynnw 2009-05-21 11:12:04

L'article suivant pourrait aider: "Comment partager des données entre les procédures stockées" http://www.sommarskog.se/share_data.html

3
répondu A-K 2009-05-21 12:52:45

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.

1
répondu Scott Anderson 2009-05-21 13:43:48