Was ist der Unterschied zwischen lokalen und globalen temporären Tabellen in SQL Server?
Was ist der Unterschied zwischen lokalen und globalen temporären Tabellen in SQL Server?
Antworten:
Ich finde diese Erklärung ziemlich klar (es ist eine reine Kopie von Technet ):
Es gibt zwei Arten von temporären Tabellen: lokale und globale. Lokale temporäre Tabellen sind nur für ihre Ersteller während derselben Verbindung zu einer Instanz von SQL Server sichtbar, als die Tabellen zum ersten Mal erstellt oder referenziert wurden. Lokale temporäre Tabellen werden gelöscht, nachdem der Benutzer die Verbindung zur Instanz von SQL Server getrennt hat. Globale temporäre Tabellen sind für jeden Benutzer und jede Verbindung nach ihrer Erstellung sichtbar und werden gelöscht, wenn alle Benutzer, die auf die Tabelle verweisen, die Verbindung zur Instanz von SQL Server trennen.
Tabellenvariablen ( DECLARE @t TABLE
) sind nur für die Verbindung sichtbar, die sie erstellt, und werden gelöscht, wenn der Stapel oder die gespeicherte Prozedur endet.
Lokale temporäre Tabellen ( CREATE TABLE #t
) sind nur für die Verbindung sichtbar, die sie erstellt, und werden gelöscht, wenn die Verbindung geschlossen wird.
Globale temporäre Tabellen ( CREATE TABLE ##t
) sind für alle sichtbar und werden gelöscht, wenn alle Verbindungen, auf die verwiesen wurde, geschlossen wurden.
Temporäre Tempdb-Tabellen ( USE tempdb CREATE TABLE t
) sind für alle sichtbar und werden beim Neustart des Servers gelöscht.
1.) Eine lokale temporäre Tabelle existiert nur für die Dauer einer Verbindung oder, falls in einer zusammengesetzten Anweisung definiert, für die Dauer der zusammengesetzten Anweisung.
Lokale temporäre Tabellen sind nur für die SQL Server-Sitzung oder -Verbindung (dh Einzelbenutzer) verfügbar, die die Tabellen erstellt hat. Diese werden automatisch gelöscht, wenn die Sitzung, in der die Tabellen erstellt wurden, geschlossen wurde. Der Name der lokalen temporären Tabelle wird mit einem einzelnen Hash-Zeichen ("#") angezeigt.
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
Der Bereich der lokalen temporären Tabelle existiert für die aktuelle Sitzung des aktuellen Benutzers bedeutet für das aktuelle Abfragefenster. Wenn Sie das aktuelle Abfragefenster schließen oder ein neues Abfragefenster öffnen und versuchen, die oben erstellte temporäre Tabelle zu finden, wird der Fehler angezeigt.
2.) Eine globale temporäre Tabelle bleibt dauerhaft in der Datenbank, aber die Zeilen existieren nur innerhalb einer bestimmten Verbindung. Wenn die Verbindung geschlossen wird, verschwinden die Daten in der globalen temporären Tabelle. Die Tabellendefinition verbleibt jedoch beim Zugriff auf die Datenbank, wenn die Datenbank das nächste Mal geöffnet wird.
Globale temporäre Tabellen stehen allen SQL Server-Sitzungen oder -Verbindungen zur Verfügung (dh allen Benutzern). Diese können von jedem SQL Server-Verbindungsbenutzer erstellt werden und werden automatisch gelöscht, wenn alle SQL Server-Verbindungen geschlossen wurden. Der Name der globalen temporären Tabelle wird mit einem doppelten Hash-Zeichen ("##") angezeigt.
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
Globale temporäre Tabellen sind für alle SQL Server-Verbindungen sichtbar, während lokale temporäre Tabellen nur für die aktuelle SQL Server-Verbindung sichtbar sind.
Zitat aus Books Online:
Lokale temporäre Tabellen sind nur in der aktuellen Sitzung sichtbar. Globale temporäre Tabellen sind für alle Sitzungen sichtbar.
Temporäre Tabellen werden automatisch gelöscht, wenn sie den Gültigkeitsbereich verlassen, es sei denn, sie werden explizit mit DROP TABLE gelöscht:
Lokale temporäre Tabellen : Wenn Sie lokale temporäre Tabellen erstellen und dann eine andere Verbindung öffnen und die Abfrage versuchen, wird der folgende Fehler angezeigt.
Auf die temporären Tabellen kann nur innerhalb der Sitzung zugegriffen werden, in der sie erstellt wurden.
Globale temporäre Tabellen : Manchmal möchten Sie möglicherweise eine temporäre Tabelle erstellen, auf die andere Verbindungen zugreifen können. In diesem Fall können Sie globale temporäre Tabellen verwenden.
Globale temporäre Tabellen werden nur zerstört, wenn alle darauf verweisenden Sitzungen geschlossen sind.
Es ist erwähnenswert, dass es auch Folgendes gibt: globale temporäre Tabellen mit Datenbankbereich (derzeit nur von Azure SQL Database unterstützt).
Globale temporäre Tabellen für SQL Server (initiiert mit dem Tabellennamen ##) werden in Tempdb gespeichert und von allen Benutzersitzungen in der gesamten SQL Server-Instanz gemeinsam genutzt.
Die Azure SQL-Datenbank unterstützt globale temporäre Tabellen, die ebenfalls in Tempdb gespeichert sind und sich auf die Datenbankebene erstrecken. Dies bedeutet, dass globale temporäre Tabellen für alle Benutzersitzungen in derselben Azure SQL-Datenbank freigegeben werden. Benutzersitzungen aus anderen Datenbanken können nicht auf globale temporäre Tabellen zugreifen.
-- 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'
ALTER DATABASE SCOPED CONFIGURATION
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
GILT FÜR: Azure SQL-Datenbank (Funktion in der öffentlichen Vorschau)
Ermöglicht das Festlegen der Auto-Drop-Funktion für globale temporäre Tabellen. Der Standardwert ist ON. Dies bedeutet, dass die globalen temporären Tabellen automatisch gelöscht werden, wenn sie von keiner Sitzung verwendet werden. Wenn diese Option auf OFF gesetzt ist, müssen globale temporäre Tabellen explizit mit einer DROP TABLE-Anweisung gelöscht werden oder werden beim Neustart des Servers automatisch gelöscht.
Bei einzelnen Azure SQL-Datenbankdatenbanken und elastischen Pools kann diese Option in den einzelnen Benutzerdatenbanken des SQL-Datenbankservers festgelegt werden. In der verwalteten Instanz von SQL Server und Azure SQL Database ist diese Option in TempDB festgelegt, und die Einstellung der einzelnen Benutzerdatenbanken hat keine Auswirkungen.
Ich habe keine Antworten gesehen, die Benutzern zeigen, wo wir eine Global Temp-Tabelle finden können. Sie können lokale und globale temporäre Tabellen an derselben Stelle anzeigen, wenn Sie in SSMS navigieren. Screenshot unten von diesem Link .
Datenbanken -> Systemdatenbanken -> Tempdb -> Temporäre Tabellen