web-dev-qa-db-fra.com

Tables temporaires locales et globales dans SQL Server

Quelle est la différence entre les tables temporaires locales et globales dans SQL Server?

126
andrew Sullivan

Je trouve cette explication assez claire (copie pure de Technet ):

Il existe deux types de tables temporaires: locales et globales. Les tables temporaires locales ne sont visibles que pour leurs créateurs lors de la même connexion à une instance de SQL Server que lors de la création ou de la référence des tables. Les tables temporaires locales sont supprimées après que l'utilisateur s'est déconnecté de l'instance de SQL Server. Les tables temporaires globales sont visibles pour tous les utilisateurs et toutes les connexions après leur création. Elles sont supprimées lorsque tous les utilisateurs qui référencent la table se déconnectent de l'instance de SQL Server.

92
Don
  • Les variables de table (DECLARE @t TABLE) ne sont visibles que par la connexion qui les crée et sont supprimées à la fin du traitement par lots ou de la procédure stockée.

  • Les tables temporaires locales (CREATE TABLE #t) ne sont visibles que par la connexion Qui les crée et sont supprimées lorsque la connexion est Fermée.

  • Les tables temporaires globales (CREATE TABLE ##t) sont visibles par tout le monde, Et sont supprimées lorsque toutes les connexions qui les ont référencées sont fermées.

  • Les tables permanentes Tempdb (USE tempdb CREATE TABLE t) sont visibles par tout le monde et sont supprimées au redémarrage du serveur.

288
Anthony Faull

Citant de la documentation en ligne:

Les tables temporaires locales ne sont visibles que dans la session en cours; Les tables temporaires globales sont visibles pour toutes les sessions.

Les tables temporaires sont automatiquement supprimées lorsqu'elles sortent de la portée, à moins d'être explicitement supprimées à l'aide de DROP TABLE: 

  • Une table temporaire locale créée dans une procédure stockée est supprimée automatiquement à la fin de la procédure stockée. La table peut être référencée par toutes les procédures stockées imbriquées exécutées par la procédure stockée qui a créé la table. La table ne peut pas être référencée par le processus qui a appelé la procédure stockée qui l'a créée.
  • Toutes les autres tables temporaires locales sont automatiquement supprimées à la fin de la session en cours.
  • Les tables temporaires globales sont automatiquement supprimées à la fin de la session qui a créé la table et lorsque toutes les autres tâches ont cessé de les référencer. L'association entre une tâche et une table n'est conservée que pendant la vie d'une seule instruction Transact-SQL. Cela signifie qu'une table temporaire globale est supprimée à la fin de la dernière instruction Transact-SQL qui faisait activement référence à la table à la fin de la session de création. 
11
Christian Hayter

1.) Une table temporaire locale n'existe que pour la durée d'une connexion ou, si elle est définie dans une instruction composée, pour la durée de l'instruction composée.

Les tables temporaires locales ne sont disponibles que pour la session SQL Server ou connexion (utilisateur unique) ayant créé les tables. Ceux-ci sont automatiquement supprimé lorsque la session qui a créé les tables a été fermé. Le nom de la table temporaire locale est affiché avec un hachage unique ("#") signe.

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

La portée de la table temporaire locale existe pour la session en cours du fichier .__ en cours. utilisateur signifie à la fenêtre de requête en cours. Si vous voulez fermer le courant fenêtre de requête ou ouvrez une nouvelle fenêtre de requête et essayera de trouver ci-dessus créé table temporaire, il vous donnera l'erreur.


2.) Une table temporaire globale reste dans la base de données en permanence, mais les lignes n'existent que dans une connexion donnée. Lorsque la connexion est fermée, les données de la table temporaire globale disparaissent. Cependant, la définition de la table reste avec la base de données pour l'accès lors de la prochaine ouverture de la base de données.

Les tables temporaires globales sont disponibles pour toutes les sessions SQL Server ou connexions (désigne tous les utilisateurs). Ceux-ci peuvent être créés par n'importe quel SQL Connexion utilisateur serveur et ceux-ci sont automatiquement supprimés lorsque tous les connexions SQL Server ont été fermées. Table temporaire globale nom est marqué avec un double signe de hachage ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Les tables temporaires globales sont visibles pour toutes les connexions SQL Server alors que les tables temporaires locales ne sont visibles que par SQL Server actuel lien.

10
Vivek S.

Il est à noter qu'il existe également: tables temporaires globales couvertes par la base de données (actuellement pris en charge uniquement par Azure SQL Database).

Les tables temporaires globales pour SQL Server (initiées avec le nom de la table ##) sont stockées dans tempdb et partagées par toutes les sessions des utilisateurs sur l’ensemble de l’instance SQL Server.

Azure SQL Database prend en charge les tables temporaires globales qui sont également stockées dans tempdb et étendues au niveau de la base de données. Cela signifie que les tables temporaires globales sont partagées pour toutes les sessions des utilisateurs au sein de la même base de données SQL Azure. Les sessions utilisateur d'autres bases de données ne peuvent pas accéder aux tables temporaires globales.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'
0
Lukasz Szozda