Jak upuścić zmienne tabeli w SQL-Server? Powinienem to zrobić?

123

Mam zmienną tabeli w skrypcie (nie procedurę składowaną). Dwa pytania:

  1. Jak usunąć zmienną tabeli? Drop Table @varName wyświetla błąd „Incorrect snytax”.
  2. Czy powinienem zawsze to robić? Słyszałem, że to dobra praktyka. Czy jest to kiedykolwiek konieczne w przypadku takich małych skryptów?

Oto mój kod:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work
jtpereyda
źródło
Nie możesz ich zostawić samodzielnie, więc druga część pytania nie ma zastosowania.
Martin Smith

Odpowiedzi:

189

Zmienne tabeli są automatycznie lokalne i automatycznie usuwane - nie musisz się tym martwić.

Hogan
źródło
17
+1 - Ponadto nie możesz ich upuścić, nawet jeśli chcesz - utrzymują się tak długo, jak długo sesja jest otwarta, tak jak każda inna zmienna. Transakcje nie mają na nie wpływu.
JNK
10
@JNKs zwraca uwagę, że transakcje nie mają na nie wpływu, jest ważne, możesz użyć zmiennych tabeli do przechowywania danych i zapisywania w tabeli dziennika po błędzie powodującym wycofanie.
HLGEM
3
Nie, to nie to samo. Tabele tymczasowe uczestniczą w transakcjach.
Paul Perigny,
Nie są też tym samym, co CTE.
Hogan
nie możesz ich upuścić, ale możesz je usunąć 'delete @projectList';)
RK Sharma
29

Zmienne tabelowe są takie same jak zmienne typu int czy varchar.

Nie musisz ich upuszczać. Mają te same reguły zasięgu , co zmienne int lub varchar

Zakres zmiennej to zakres instrukcji języka Transact-SQL, które mogą odwoływać się do zmiennej. Zakres zmiennej trwa od momentu jej zadeklarowania do końca partii lub procedury składowanej, w której została zadeklarowana.

gbn
źródło
1
Czy wiesz, czy obiekty tempdb utworzone przez zmienne tabeli są czyszczone, gdy wychodzą poza zakres? A może serwer czeka, aż sesja zostanie zamknięta, zanim je wyczyści?
StriplingWarrior
21

jeśli ktoś inny natknie się na to ... i naprawdę musisz to porzucić, tak jak w pętli, możesz po prostu usunąć wszystko ze zmiennej tabeli:

DELETE FROM @tableVariableName
Leo Much
źródło
7

Ale wszyscy zapomnieliście wspomnieć, że jeśli tabela zmiennych jest używana w pętli, będzie wymagała opróżnienia (usuń @table) przed ponownym załadowaniem danych w pętli.

Peppe
źródło
3

Podobnie jak TempTables, lokalna zmienna tabeli jest również tworzona w TempDB. Zakres zmiennej tabeli to partia, procedura składowana i blok instrukcji, w którym jest zadeklarowana. Mogą być przekazywane jako parametry między procedurami. Są one automatycznie usuwane po zamknięciu sesji, w której zostały utworzone.

Gagan
źródło
Tabela #temp nie jest tym samym, co zmienna @table, nie jest usuwana automatycznie po zakończeniu poprawki lub zakresu, jest usuwana automatycznie tylko wtedy, gdy została utworzona w ramach procedury składowanej i procedura składowana została zakończona
Abou-Emish
1

Oto rozwiązanie

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;

Działa dobrze na SQL Server 2014 Christophe

CSonneck
źródło