Как убрать переменные таблицы в SQL-сервере?Должен ли я даже сделать это? - PullRequest
107 голосов
/ 13 апреля 2011

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

  1. Как мне удалить табличную переменную? Удаление таблицы @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

Ответы [ 6 ]

163 голосов
/ 13 апреля 2011

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

29 голосов
/ 13 апреля 2011

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

Вам не нужно бросать их. Они имеют те же правила scope , что и переменные типа int или varchar

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

15 голосов
/ 02 августа 2017

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

DELETE FROM @tableVariableName
4 голосов
/ 28 апреля 2017

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

3 голосов
/ 15 мая 2015

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

1 голос
/ 11 апреля 2019

Вот решение

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 Кристоф

...