Как удалить переменные таблицы в SQL-сервере? Стоит ли мне вообще это делать?

123

У меня есть табличная переменная в скрипте (не хранимая процедура). Два вопроса:

  1. Как удалить переменную таблицы? Drop Table @varName выдает ошибку «Неверный snytax».
  2. Всегда ли я должен это делать? Я слышал, это хорошая практика. Действительно ли это необходимо для таких небольших скриптов?

Вот мой код:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work
jtpereyda
источник
Вы не можете сами их бросить, поэтому вторая часть вашего вопроса не применима.
Мартин Смит

Ответы:

189

Табличные переменные автоматически становятся локальными и автоматически удаляются - вам не о чем беспокоиться.

Hogan
источник
17
+1 - Также вы не можете отбросить их, даже если захотите - они сохраняются, пока сеанс открыт, как и любая другая переменная. Они также не зависят от транзакций.
JNK
10
@JNK указывает на то, что транзакции не влияют на них, вы можете использовать переменные таблицы для хранения данных и записи в таблицу журнала после того, как ошибка вызывает откат.
HLGEM
3
Нет, это не то же самое. В транзакциях участвуют временные таблицы.
Пол Периньи,
И они не то же самое, что CTE.
Hogan
их нельзя отбросить, но можно удалить 'delete @projectList';)
РК Шарма
29

Табличные переменные похожи на переменные типа int или varchar.

Их не нужно ронять. У них те же правила области видимости, что и у переменных типа int или varchar.

Объем переменной - это диапазон операторов Transact-SQL, которые могут ссылаться на переменную. Область действия переменной длится с момента ее объявления до конца пакета или хранимой процедуры, в которых она объявлена.

ГБН
источник
1
Вы знаете, очищаются ли объекты tempdb, созданные табличными переменными, когда они выходят за пределы области видимости? Или сервер ждет закрытия сеанса перед их очисткой?
StriplingWarrior
21

если кто-то еще столкнется с этим ... и вам действительно нужно отбросить это, как в цикле, вы можете просто удалить все из переменной таблицы:

DELETE FROM @tableVariableName
Лев Мач
источник
7

Но вы все забыли упомянуть, что если таблица переменных используется в цикле, ее необходимо очистить (удалить @table) перед повторной загрузкой данных в цикле.

Peppe
источник
3

Как и TempTables, в TempDB также создается локальная табличная переменная. Объем табличной переменной - это пакет, хранимая процедура и блок операторов, в которых она объявлена. Их можно передавать как параметры между процедурами. Они автоматически удаляются, когда вы закрываете сеанс, в котором вы их создали.

Gagan
источник
Таблица #temp - это не то же самое, что переменная @table, она не удаляется автоматически после окончания патча или области видимости, она удаляется автоматически только в том случае, если она была создана внутри хранимой процедуры и хранимая процедура завершила выполнение
Abou-Emish
1

Вот решение

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;

Прекрасно работает на SQL Server 2014 Christophe

CSonneck
источник