Могут ли две сессии создавать таблицы #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, я вижу созданные там временные таблицы со случайной (уникальной) строкой, добавляемой к имени каждой временной таблицы.

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


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