Wie lösche ich Tabellenvariablen in SQL-Server? Soll ich das überhaupt machen?

123

Ich habe eine Tabellenvariable in einem Skript (keine gespeicherte Prozedur). Zwei Fragen:

  1. Wie lösche ich die Tabellenvariable? Drop Table @varName gibt einen Fehler "Falsche Snytax" aus.
  2. Soll ich das immer machen Ich höre, es ist eine gute Praxis. Ist es jemals wirklich notwendig für solche kleinen Skripte?

Hier ist mein Code:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work
jtpereyda
quelle
Sie können sie nicht selbst fallen lassen, sodass der zweite Teil Ihrer Frage nicht zutrifft.
Martin Smith

Antworten:

189

Tabellenvariablen sind automatisch lokal und werden automatisch gelöscht - Sie müssen sich darüber keine Sorgen machen.

Hogan
quelle
17
+1 - Sie können sie auch dann nicht löschen, wenn Sie möchten - sie bleiben wie jede andere Variable bestehen, solange die Sitzung geöffnet ist. Sie sind auch von Transaktionen nicht betroffen.
JNK
10
@JNKs Hinweis darauf, dass sie von Transaktionen nicht betroffen sind, ist wichtig. Sie können Tabellenvariablen verwenden, um Daten zu speichern und in eine Protokolltabelle zu schreiben, nachdem ein Fehler ein Rollback verursacht hat.
HLGEM
3
Nein, es ist nicht dasselbe. Temp-Tabellen nehmen an Transaktionen teil.
Paul Perigny
Sie sind auch nicht mit CTEs identisch.
Hogan
Sie können sie nicht löschen, aber Sie können sie löschen 'delete @projectList';)
RK Sharma
29

Tabellenvariablen sind genau wie int- oder varchar-Variablen.

Sie müssen sie nicht fallen lassen. Sie haben dieselben Bereichsregeln wie int- oder varchar-Variablen

Der Bereich einer Variablen ist der Bereich von Transact-SQL-Anweisungen, die auf die Variable verweisen können. Der Gültigkeitsbereich einer Variablen dauert vom Deklarationspunkt bis zum Ende des Stapels oder der gespeicherten Prozedur, in der sie deklariert wird.

gbn
quelle
1
Wissen Sie, ob die von Tabellenvariablen erstellten Tempdb-Objekte bereinigt werden, wenn sie den Gültigkeitsbereich verlassen? Oder wartet der Server, bis die Sitzung geschlossen ist, bevor er sie bereinigt?
StriplingWarrior
21

Wenn jemand anderes darauf stößt ... und Sie es wirklich wie in einer Schleife löschen müssen, können Sie einfach alles aus der Tabellenvariablen löschen:

DELETE FROM @tableVariableName
Leo Much
quelle
7

Sie alle haben jedoch vergessen zu erwähnen, dass eine Variablentabelle, die in einer Schleife verwendet wird, vor dem erneuten Laden mit Daten in einer Schleife geleert (delete @table) werden muss.

Peppe
quelle
3

Genau wie TempTables wird auch in TempDB eine lokale Tabellenvariable erstellt. Der Bereich der Tabellenvariablen ist der Stapel, die gespeicherte Prozedur und der Anweisungsblock, in dem sie deklariert ist. Sie können als Parameter zwischen Prozeduren übergeben werden. Sie werden automatisch gelöscht, wenn Sie die Sitzung schließen, in der Sie sie erstellen.

Gagan
quelle
Die Tabelle #temp ist nicht mit der Variablen @table identisch. Sie wird nach dem Ende des Patches oder Bereichs nicht automatisch gelöscht. Sie wird nur dann automatisch gelöscht, wenn sie in einer gespeicherten Prozedur erstellt und die Ausführung der gespeicherten Prozedur abgeschlossen wurde.
Abou-Emish
1

Hier ist eine Lösung

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

Funktioniert gut unter SQL Server 2014 Christophe

CSonneck
quelle