Обязательно ли использовать # для создания временных таблиц на SQL-сервере?


91

Обязательно ли использовать #перед созданием временной таблицы на SQL сервере?

Пример:

SELECT column1, column2, someInt, someVarChar 
INTO ItemBack1 
FROM table2
WHERE table2.ID = 7

Для ItemBack1 нужно ли использовать #символ?

Если нет, то какой смысл #в создании временных таблиц?


3
Да. # создает временную таблицу. Без него создается таблица.
— Jeow Li Huan

Ответы:


151

Да. Для создания временных таблиц необходимо добавить к имени таблицы префикс "#" (хеш).

Если в дальнейшем таблица вам НЕ понадобится, создайте ее. Временные таблицы очень похожи на обычные таблицы. Однако он создается в базе данных tempdb. Кроме того, он доступен только через текущий сеанс, т.е. для EG: если другой пользователь попытается получить доступ к созданной вами временной таблице, он не сможет это сделать.

«##» (двойной хеш создает «глобальную» временную таблицу, к которой могут обращаться и другие сеансы.

См. Приведенную ниже ссылку для ознакомления с основными сведениями о временных таблицах: http://www.codeproject.com/Articles/42553/Quick-Overview-Temporary-Tables-in-SQL-Server-2005

Если содержимое вашей таблицы меньше 5000 строк и НЕ содержит таких типов данных, как nvarchar (MAX), varbinary (MAX), рассмотрите возможность использования переменных таблицы.

Они самые быстрые, так как такие же, как и любые другие переменные, хранящиеся в ОЗУ. Они также хранятся в базе данных tempdb, а не в оперативной памяти .

DECLARE @ItemBack1 TABLE
(
 column1 int,
 column2 int,
 someInt int,
 someVarChar nvarchar(50)
);

INSERT INTO @ItemBack1
SELECT column1, 
       column2, 
       someInt, 
       someVarChar 
  FROM table2
 WHERE table2.ID = 7;

Дополнительная информация о табличных переменных: http://odetocode.com/articles/365.aspx


11
В SQL Server синтаксис SELECT: INSERT INTO @ ItemBack1 SELECT column1, column2, someInt, someVarChar FROM table2 WHERE table2.ID = 7
— mhenry1384

8
Таблицы переменных не хранятся в оперативной памяти, они также хранятся в tempdb. Я бы рекомендовал не использовать табличные переменные, если вы не понимаете некоторые из их недостатков, поскольку их количество строк автоматически устанавливается равным единице, и это может привести к плохим планам.
— ConstantineK

Можете ли вы предоставить источник для 5000 строк, ограничений nvarchar (max), varbinary (max)? Это разрешено, но я не уверен, почему это не рекомендуется.
— Брэд

1
Я тоже думал, что переменные таблицы хранятся в памяти. Я исправлюсь
— Баодад

1
Я собираюсь только прокомментировать, что это факт, что переменные таблицы хранятся в tempdb. Я комментирую, так что, возможно, БОЛЬШЕ людей читают комментарии и забивают их себе в головы, потому что я так устал ходить в совместную работу в качестве старшего консультанта, чтобы спорить с штатным сотрудником, который ничего не знает и пытается сказать иначе. Я говорю о десятках компаний из списка Fortune 500, так что рад видеть комментарии людей. К ПЕЧЕНИЮ, если этот ОП, который отвечает на вопрос, на самом деле НЕ РЕДАКТИРУЕТ свой ответ, этот невежественный человек будет продолжать существовать еще десять лет или около того.
— Tom Stickel 07

14

Разница между этими двумя столами ItemBack1и #ItemBack1в том , что в первую очередь на является постоянной (постоянное) , где , как и другие временно.

Теперь, если взглянем на свой вопрос еще раз

Нужно ли использовать # для создания временной таблицы на сервере sql?

Ответ - Да , потому что без этого предшествующая #таблица не будет временной таблицей, она не будет зависеть от всех сеансов и областей.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.