Обязательно ли использовать # для создания временных таблиц на 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

Mobiledaemon
источник
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?

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

Zzlalani
источник