SQL Server-Tabellen: Was ist der Unterschied zwischen @, # und ##?

88

Was ist in SQL Server der Unterschied zwischen einer @ -Tabelle, einer # -Tabelle und einer ## -Tabelle?

Craig Schwarze
quelle

Antworten:

113

#table bezieht sich auf eine lokale (nur für den Benutzer sichtbar, der sie erstellt hat) temporäre Tabelle.

##table bezieht sich auf eine globale (für alle Benutzer sichtbare) temporäre Tabelle.

@variableName bezieht sich auf eine Variable, die je nach Typ Werte enthalten kann.

Arnkrishn
quelle
29
Ihre Definition von #table ist nicht ganz korrekt. Es ist nicht auf den Benutzer beschränkt, sondern auf die Verbindung. Wenn ein Benutzer mehrere Verbindungen hat, ist dies nur für die Verbindung sichtbar, die die # -Tabelle erstellt hat.
Davin Studer
@DavinStuder hat eine entscheidende Klarstellung angeboten. Die Unterscheidung zwischen einer für den Benutzer sichtbaren Tabelle und einer Tabelle, die nur für die aktuelle Verbindung sichtbar ist, ist sehr wichtig.
Mirzmaster
@DavinStuder Wie werden mehrere Verbindungen für Benutzer angezeigt? die gleiche Verbindungszeichenfolge?
Kiquenet
25

Schau es dir an

Adriaan Stander
quelle
4
Mir ist klar, dass dies schon lange her ist, aber da dies eine reine Linkantwort ist (und der erste Link tot ist), könnte sie mit den wichtigsten Erkenntnissen aus jedem der Links aktualisiert werden?
Mike Guthrie
7

#und ##Tabellen sind tatsächliche Tabellen, die in der temporären Datenbank dargestellt werden. Diese Tabellen können Indizes und Statistiken enthalten und über Sprocs in einer Sitzung hinweg zugänglich sein (im Fall einer globalen temporären Tabelle ist sie sitzungsübergreifend verfügbar).

Die @ Tabelle ist eine Tabellenvariable.

Für mehr: http://www.sqlteam.com/article/temporary-tables

jammern
quelle
4
Die Tabellenvariable wird auch in der tempDB-Datenbank gespeichert, wenn ihre Größe zu groß ist, um im Speicher gespeichert zu werden.
Marc_s
6

Ich würde mich auf die Unterschiede zwischen #table und @table konzentrieren. ## table ist eine globale temporäre Tabelle, und für den Datensatz in über 10 Jahren mit SQL Server habe ich noch keinen gültigen Anwendungsfall gefunden. Ich bin sicher, dass einige existieren, aber die Natur des Objekts macht es meiner Meinung nach höchst unbrauchbar.

Die Antwort von @marc_s auf @whiner ist absolut wahr: Es ist ein weit verbreiteter Mythos, dass Tabellenvariablen immer im Speicher leben. Tatsächlich ist es durchaus üblich, dass eine Tabellenvariable auf die Festplatte wechselt und wie eine temporäre Tabelle funktioniert.

Wie auch immer, ich schlage vor, die Unterschiede zu lesen, indem Sie den von @Astander angegebenen Links folgen. Der größte Unterschied besteht in Einschränkungen, was Sie mit @ table-Variablen nicht tun können.

Aaron Bertrand
quelle
Ich habe 5 separate gespeicherte Prozeduren, die verschiedene Teile einer Berechnung ausführen und ein einzelnes Ergebnis ausgeben. Für die Prüfung möchte ich Zwischenwerte sehen, ebenso wie der Prüfer. Ich habe meine Prozeduren so angepasst, dass einige in eine ## Temp-Tabelle verschoben werden, damit wir beide sie anzeigen können, sie jedoch nicht beibehalten werden (sie werden nur während Audits benötigt). Es gibt einen gültigen Anwendungsfall für Sie (IMHO!).
RyanfaeScotland
@ Ryan warum ist ## Tabelle gültig, wenn Sie dbo.Table hätten verwenden können? Ich halte es nicht für einen gültigen Anwendungsfall, wenn Sie sich nur vor der Eingabe einer DROP-Anweisung bewahrt haben.
Aaron Bertrand
4
Ich möchte dem Auditor keine DROP-Berechtigungen für meine Datenbank erteilen. Ich möchte auch nicht zurückkommen und aufräumen müssen, nachdem er fertig ist. Mit einer temporären Tabelle kann er die Abfrage so oft ausführen, wie er möchte, und ich weiß, wenn er fertig ist, hinterlässt er keinen Footprint in der Datenbank.
RyanfaeScotland
4
CREATE TABLE #t

Erstellt eine Tabelle, die nur für diese VERBINDUNG sichtbar ist, und während dieser VERBINDUNG kann derselbe Benutzer, der eine andere Verbindung erstellt, die Tabelle #t der anderen Verbindung nicht sehen.

CREATE TABLE ##t

Erstellt eine temporäre Tabelle, die für andere Verbindungen sichtbar ist. Die Tabelle wird jedoch gelöscht, wenn die erstellende Verbindung beendet wird.

Markus
quelle
SqlConnection.Open()mit der gleichen Verbindungszeichenfolge ist die gleiche Verbindung ?
Kiquenet
2
Nein, es ist eine Verbindung zu derselben Datenbank, aber mit ziemlicher Sicherheit nicht dieselbe Verbindung.
Markus
0

Wenn Sie eine eindeutige globale temporäre Tabelle benötigen, erstellen Sie eine eigene Tabelle mit einem eindeutigen Präfix / Suffix und löschen Sie die Post-Ausführung, wenn eine if-Objekt-ID (....). Der einzige Nachteil ist die Verwendung von Dynamic SQL und muss explizit gelöscht werden.

Schmed
quelle