Могут ли две сессии создавать таблицы #temp с одинаковыми именами?

16

Я создаю временную таблицу ( #myTable) и использую курсор. Создает ли это проблему, когда параллельные пользователи получают доступ к курсору через мое приложение? Позволяет ли мне создавать отдельные временные таблицы с одинаковыми именами?

Ниже приведен пример кода:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 
Суджит Каривелил
источник

Ответы:

20

Сервер SQL всегда добавляет некоторое случайное число в конец имени временной таблицы (за кулисами), когда параллельные пользователи создают временные таблицы в своих сеансах с одинаковыми именами, SQL-сервер создает несколько временных таблиц в базе данных tempdb.

Я создал 3 временные таблицы, вызываемые #TempTableв трех разных сеансах в моей SSMS, и теперь, если я перехожу к базе данных tempdb, я вижу созданные там временные таблицы со случайной (уникальной) строкой, добавляемой к имени каждой временной таблицы.

введите описание изображения здесь

M.Ali
источник
11

Да, несколько приложений получат свои собственные копии таблицы #temp. В этом и заключается смысл использования таблицы #temp, потому что каждый параллельный сеанс имеет свой собственный изолированный объект. Это не имеет никакого отношения к тому, используете ли вы курсор в сочетании с вашей таблицей #temp (хотя я подозреваю, что курсор в любом случае не нужен - вы не включили достаточно кода для комментариев).

Изменить, чтобы включить комментарий:

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

Аарон Бертран
источник
7
Еще одна вещь, связанная с использованием таблиц #temp, заключается в том, что если вам нужно добавить к ним ограничения, позвольте SQL-серверу сгенерировать имя в противном случае, даже если таблица будет уникальной для сеанса, которого нет у ограничения, и второй экземпляр выдаст ошибку при создании стол.
Аарон
1
@ Аарон - Предложите переместить комментарий о безымянных ограничениях в ответ. Многие люди запутались в этой детали.
RLF
Также обратите внимание , что если кто - то делает хочет глобальную временную таблицу, они могут объявить его ##likeThis.
underscore_d
@RLF и Aaron: всегда можно создать GUID с помощью NEWID () и создать ограничение с помощью динамического SQL. Не сказать, что это так же чисто, как включение его в оператор CREATE TABLE, но это по крайней мере вариант. И я также считаю, что ограничения FK не разрешены для временных таблиц (если мы говорим об ограничениях в общем).
Соломон Руцкий
@srutzky - Истина, но именованные ограничения обычно именуются так, чтобы было легче ссылаться на них из кода. Использование NEWID () не обеспечит это упрощение, хотя вы можете запросить, чтобы найти NEWID, если это необходимо.
RLF