Können zwei Sitzungen # temporäre Tabellen mit demselben Namen erstellen?

16

Ich erstelle eine temporäre Tabelle ( #myTable) und benutze einen Cursor. Tritt ein Problem auf, wenn gleichzeitig angemeldete Benutzer über meine Anwendung auf den Cursor zugreifen? Kann ich separate temporäre Tabellen mit demselben Namen erstellen?

Es folgt der Beispielcode:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 
Sujith Karivelil
quelle

Antworten:

20

SQL Server hängt immer eine Zufallszahl an das Ende eines temporären Tabellennamens an (hinter den Kulissen). Wenn die gleichzeitigen Benutzer temporäre Tabellen in ihren Sitzungen mit demselben Namen erstellen, erstellt SQL Server mehrere temporäre Tabellen in der temporären Datenbank.

Ich habe 3 temporäre Tabellen erstellt, die #TempTablein drei verschiedenen Sitzungen in meinem SSMS aufgerufen wurden. Wenn ich jetzt zur temporären Datenbank gehe, kann ich die temporären Tabellen sehen, die dort mit einer zufälligen (eindeutigen) Zeichenfolge erstellt wurden, die an den Namen jeder temporären Tabelle angehängt ist.

Bildbeschreibung hier eingeben

M.Ali
quelle
11

Ja, mehrere Anwendungen erhalten ihre eigenen Kopien der #temp-Tabelle. Dies ist der Punkt, an dem eine #temp-Tabelle verwendet wird, da jede gleichzeitige Sitzung ein eigenes, isoliertes Objekt hat. Dies hat nichts damit zu tun, ob Sie einen Cursor in Kombination mit Ihrer #temp-Tabelle verwenden (obwohl ich vermute, dass der Cursor ohnehin nicht benötigt wird - Sie haben nicht genügend Code für einen Kommentar angegeben).

Bearbeiten, um einen Kommentar hinzuzufügen:

Eine zusätzliche Sache bei der Verwendung von #temp -Tabellen ist, dass SQL Server den Namen generieren kann, wenn Sie ihm Einschränkungen hinzufügen müssen. Andernfalls ist die Tabelle für die Sitzung eindeutig, die Einschränkung wird jedoch nicht ausgeführt, und die zweite Instanz erstellt die Tabelle.

Aaron Bertrand
quelle
7
Eine zusätzliche Sache bei der Verwendung von #temp -Tabellen ist, dass SQL Server den Namen generieren kann, wenn Sie ihm Einschränkungen hinzufügen müssen. Andernfalls ist die Tabelle für die Sitzung eindeutig, die Einschränkung wird jedoch nicht ausgeführt, und die zweite Instanz erstellt die Tabelle.
Aaron
1
@Aaron - Schlagen Sie vor, dass Sie den Kommentar zu unbenannten Einschränkungen in die Antwort verschieben. Viele Leute vermasseln dieses Detail.
RLF
Beachten Sie auch, dass jemand, der eine globale temporäre Tabelle haben möchte, diese deklarieren kann ##likeThis.
Underscore_d
@RLF und Aaron: Mit NEWID () kann man immer eine GUID generieren und die Einschränkung über Dynamic SQL erstellen. Das ist nicht so sauber wie das Einfügen in die Anweisung CREATE TABLE, aber es ist zumindest eine Option. Und ich glaube auch, dass FK-Einschränkungen für temporäre Tabellen nicht zulässig sind (solange wir allgemein von Einschränkungen sprechen).
Solomon Rutzky
@srutzky - Richtig, aber benannte Einschränkungen werden normalerweise so benannt, dass es einfach ist, sie aus dem Code zu referenzieren. Die Verwendung einer NEWID () bietet diese Vereinfachung nicht, obwohl Sie bei Bedarf die NEWID abfragen können, um sie zu finden.
RLF