Чи можуть два сеанси створювати таблиці #temp з однаковою назвою?


17

Я створюю тимчасову таблицю ( #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
@Aaron - Запропонуйте перенести коментар щодо неназваних обмежень у відповідь. Багато людей псують цю деталь.
RLF

Також зверніть увагу , що якщо хто - то робить хоче глобальну тимчасову таблицю, вони можуть оголосити його ##likeThis.
підкреслити_26

@RLF та Aaron: завжди можна створити GUID за допомогою NEWID () та створити обмеження за допомогою Dynamic SQL. Не кажучи про те, що це так само чисто, як включити його до заяви CREATE TABLE, але це принаймні варіант. І я також вважаю, що обмеження ФК не допускаються на тимчасових таблицях (поки ми загалом говоримо про обмеження).
Соломон Руцький

@srutzky - Щоправда, але названі обмеження зазвичай називаються так, щоб полегшити посилання на них з коду. Використання NEWID () не забезпечить такого спрощення, хоча ви можете запитувати, щоб знайти NEWID, якщо це потрібно.
RLF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.