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

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ć.


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.


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

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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.