Was ist in SQL Server der Unterschied zwischen einer @ -Tabelle, einer # -Tabelle und einer ## -Tabelle?
Was ist in SQL Server der Unterschied zwischen einer @ -Tabelle, einer # -Tabelle und einer ## -Tabelle?
Antworten:
#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.
Schau es dir an
#
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.
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.
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.
SqlConnection.Open()
mit der gleichen Verbindungszeichenfolge ist die gleiche Verbindung ?
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.