Was ist der Unterschied zwischen #temptable
und ##TempTable
in SQL Server?
quelle
Was ist der Unterschied zwischen #temptable
und ##TempTable
in SQL Server?
#table
bezieht sich auf eine lokale temporäre Tabelle, die nur für den Benutzer sichtbar ist, der sie erstellt hat
##table
bezieht sich auf eine globale temporäre Tabelle, die für alle Benutzer sichtbar ist
#TempTables
sind nicht nur lokal für den Benutzer oder die Verbindung. Sie sind lokal für den Prozess, der sie erstellt hat, und für alle Prozesse, die der Erstellungsprozess erzeugt. Zum Beispiel, wenn ich Folgendes habe:
Declare @strDynamicSQL as varchar(8000)
Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
Ich erhalte folgende Fehlermeldung:
Meldung 208, Ebene 16, Status 0, Zeile 7 Ungültiger Objektname '#TheDateTable'.
Aber wenn ich es mache:
Declare @strDynamicSQL as varchar(8000)
Create Table #TheDateTable (
TheDate DateTime
)
Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
Ich bekomme keine Fehler.
Im ersten Beispiel erfolgt die Execute
Anweisung in einem erzeugten Prozess. Da die Tabelle in diesem Prozess erstellt wird, wenn sie zurückgegeben wird, verschwindet dieser Prozess. Und mit dem Prozess ist die Tabelle "bye-bye".
Im zweiten Beispiel wird die Tabelle vom Prozess der obersten Ebene erstellt. Es wird dann im gespawnten Prozess interagiert. Die Tabelle steht dem Prozess zur Verfügung, in dem sie erstellt wurde, und jedem Prozess, den sie erzeugt.
##tables
brechen Sie dies. Der Prozess, in dem eine ##
Tabelle erstellt wird, ist der Steuerungsprozess. Die Tabelle wird nicht zum Entfernen markiert, wenn dieser Prozess noch aktiv ist, auch wenn für diesen Prozess keine Aufgaben vorhanden sind. Sobald der Prozess, in dem die ##
Tabelle erstellt wurde, nicht mehr vorhanden ist, wird die Tabelle zum Entfernen markiert, wenn die letzte Aufgabe für sie ausgeführt wird.
Hier ist eine einfache Möglichkeit, dies zu sehen. #
Tabellen sind nur im Umfang des Prozesses ##
verfügbar, in dem sie erstellt wurden. Sie sind auf dieselbe Weise verfügbar wie jede andere Tabelle, mit der Ausnahme, dass die Existenz mit dem Prozess, in dem sie erstellt wurde, ein- und ausgeht.
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.
einfache Art zu testen #localtable and ##globaltable
Versuchen Sie dies in einem anderen SQL-Abfragefenster
create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable
Versuchen Sie dies in einem anderen SQL-Abfragefenster
create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable
Wenn Sie nun die Auswahlabfrage für die Tabelle #localtemptable in der globalen Fenstersyntax ausführen, wird folgende Fehlermeldung angezeigt: -
Invalid object name '#localtemptable'.
Während Sie die Auswahlabfrage für die Tabelle ausführen: ## globaltemptable in einem Abfragefenster derselben Sitzung, werden die Abfrageergebnisse zurückgegeben.
Die Tabelle ist sichtbar / verfügbar, bis der Prozess / die Verbindung, die sie erstellt hat, endet und nur für die Sitzung, die sie erstellt hat.
Die Tabelle ist global und steht allen zur Verfügung, bis der Prozess / die Sitzung, die sie erstellt hat, beendet ist.
"#" bezeichnet lokale temporäre Tabellen
Es beginnt mit einem einzelnen Hashwert "#" als Präfix des Tabellennamens.
Eine lokale temporäre Tabelle gilt nur für die Verbindung, in der sie
erstellt wurde. Jede lokale temporäre Tabelle hat einen zufälligen Wert am Ende des Tabellennamens.
Eine lokale temporäre Tabelle wird automatisch gelöscht, wenn die vorhandene Verbindung geschlossen wird, oder der Benutzer kann sie explizit mit dem folgenden Befehl "drop table #TempTable" löschen.
Wenn die temporäre Tabelle in einer gespeicherten Prozedur erstellt wird, wird sie nach Abschluss der Ausführung der gespeicherten Prozedur automatisch gelöscht.
Sie können eine lokale temporäre Tabelle mit demselben Namen, jedoch in einer anderen Verbindung erstellen, die zusammen mit verschiedenen Zufallswerten unter demselben Namen gespeichert wird.
"##" bezeichnet globale temporäre Tabellen