Quelle est la différence entre les tables temporaires locales et globales dans SQL Server?
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.
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.
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:
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.
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'