Unterschied zwischen #temptable und ## TempTable?


Antworten:


33

#tablebezieht sich auf eine lokale temporäre Tabelle, die nur für den Benutzer sichtbar ist, der sie erstellt hat

##tablebezieht sich auf eine globale temporäre Tabelle, die für alle Benutzer sichtbar ist


23

#TempTablessind 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 ExecuteAnweisung 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.

##tablesbrechen 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.


10

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.

Von hier genommen

Mehr dazu


4

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.


0

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.


0

"#" 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

  • Es beginnt mit dem einzelnen Hashwert "##" als Präfix des Tabellennamens und sein Name ist immer eindeutig.
  • An den Namen wird keine Zufallszahl angehängt. Globale temporäre Tabellen sind für alle Verbindungen von SQL Server sichtbar.
  • Globale temporäre Tabellen werden nur zerstört, wenn die letzte Verbindung, die auf die Tabelle verweist, geschlossen ist (in der wir die globale temporäre Tabelle erstellt haben).
  • Sie können von allen Verbindungen von SQL Server aus auf die globalen temporären Tabellen zugreifen, bis die referenzierende Verbindung geöffnet ist.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.