46 votes

SQL Server 2005 et la portée de la table temporaire

J'ai lu le sujet de tables temporaires et de la portée et de toutes les réponses que j'ai vu ne semble pas parler d'un de mes préoccupations.

Je comprends qu'une table temporaire locale du champ d'application n'est valable que dans la durée de vie d'une procédure stockée ou d'un enfant de procédures stockées. Cependant, ce qui est la situation en ce qui concerne concurency. c'est à dire si j'ai une procédure stockée qui crée une table temporaire qui est appelée à partir de deux processus différents mais de la même utilisateur/chaîne de connexion, cette table temporaire sera partagé 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 au champ de l'appel à la stockées procdure mais je veux être sûr avant de me lancer en bas d'un chemin avec cette.

76voto

Andomar Points 115404

Les tables temporaires locales (commençant par #) sont limitées à votre session; d'autres sessions, même chez le même utilisateur/chaîne de connexion, vous ne pouvez pas les voir. Les règles pour la durée de vie dépendra de la table temporaire locale a été créé dans une procédure stockée:

  • Une table temporaire locale qui est créé dans une procédure stockée est supprimée lors de la fin de la procédure; d'autres procédures stockées, ou du processus de l'appel ne peut pas les voir.
  • Les autres tables temporaires locales sont supprimées lorsque la session se termine.

Les tables temporaires globales (commençant par ##) sont partagées entre les sessions. Ils sont perdus lors de l':

  • La session qui se termine
  • ET aucune autre session est en se référant à eux

Cette commande peut être utile pour voir les tables temporaires existent:

select TABLE_NAME from tempdb.information_schema.tables

Et c'est pratique pour déposer des tables temporaires si vous n'êtes pas sûr qu'il en existe:

if object_id('tempdb..#SoTest') is not null drop table #SoTest

Voir cet article MSDN pour plus d'informations.

11voto

Martynnw Points 3272

La table temporaire sera accessible à l'instance de la procédure qui la 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')
 

Résultats

 Col
1

Col
2
 

ne 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" exécutées par la procédure initiale.

3voto

AlexKuznetsov Points 9555

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

1voto

Scott Anderson Points 7522

Vous pourriez aussi penser à utiliser des variables de table. Ils ont une portée très bien définie et sont parfois plus rapides que leurs homologues de la table temporaire. Le seul problème avec les variables de table est qu'elles ne peuvent pas être indexées, ce qui peut entraîner une perte de performances malgré leur nature. Vérifiez ici pour plus d'informations sur le sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X