Як видалити змінні таблиці в SQL-сервер? Чи варто мені це навіть зробити?


123

У мене в скрипті є змінна таблиця (не збережена процедура). Два питання:

  1. Як я скидаю змінну таблиці? Таблиця випаду @varName видає помилку "Неправильний снітакс".
  2. Чи слід завжди це робити? Я чую, що це хороша практика. Чи справді колись потрібні такі маленькі сценарії?

Ось мій код:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work

Ви не можете залишити їх самостійно, щоб друга частина вашого питання не стосувалася.
Мартін Сміт

Відповіді:


189

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


17
+1 - Також ви не можете їх відмовити, навіть якщо хочете - вони зберігаються, доки сеанс відкритий, як і будь-яка інша змінна. На них також не впливають транзакції.
JNK

10
@JNKs важливий пункт про те, що транзакції не впливають на них, ви можете використовувати змінні таблиці для зберігання даних та запису в таблицю журналу після того, як помилка викликає відкат.
HLGEM

3
Ні, це не те саме. Тимчасові таблиці беруть участь в транзакціях.
Пол Періньї

Вони також не такі, як CTE.
Хоган

ви не можете їх кинути, але ви можете видалити їх 'delete @projectList';)
RK Sharma

29

Змінні таблиці так само, як int або varchar змінні.

Не потрібно їх скидати. Вони мають ті ж правила області застосування , що і змінні int або varchar

Область змінної - це діапазон операторів Transact-SQL, які можуть посилатися на змінну. Область змінної триває з моменту, коли вона оголошена до кінця партії або збереженої процедури, в якій вона оголошена.


1
Чи знаєте ви, чи очищаються об'єкти tempdb, створені змінними таблиці, коли вони виходять із сфери застосування? Або сервер чекає, поки сеанс закриється, перш ніж їх очистити?
Стрипінг-воїн

21

якщо хтось інший натрапив на це ... і вам справді потрібно скинути це як у циклі, ви можете просто видалити все зі змінної таблиці:

DELETE FROM @tableVariableName

7

Але ви всі забули згадати, що якщо таблиця змінної використовується в циклі, перед завантаженням даних знову в циклі потрібно буде виправити (видалити @table).


3

Як і TempTables, в TempDB також створюється змінна локальна таблиця. Область змінної таблиці - це пакетна, збережена процедура та блок операторів, в яких вона оголошена. Вони можуть передаватися як параметри між процедурами. Вони автоматично відміняються, коли ви закриваєте сеанс, на якому ви їх створюєте.


Таблиця #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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.