Різниця між #temptable та ## TempTable?


Відповіді:


34

#tableвідноситься до місцевого тимчасову таблицю - видиму лише користувачеві, який її створив

##tableвідноситься до глобальної тимчасової таблиці - видимої для всіх користувачів


26

#TempTablesне просто локальні для Користувача, або зв’язок. Вони локальні для процесу, який їх створив, та будь-яких процесів, що створюють процес створення. Наприклад, якщо я маю таке:

Declare @strDynamicSQL as varchar(8000)

Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)

Select *
From #TheDateTable

Я отримую таку помилку:

Повідомлення 208, рівень 16, стан 0, рядок 7 Недійсна назва об’єкта '#TheDateTable'.

Але якщо я:

Declare @strDynamicSQL as varchar(8000)

Create Table #TheDateTable (
    TheDate     DateTime
)

Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)

Select *
From #TheDateTable

Я не отримую помилок.

У першому прикладі Execute висловлювання відбувається в породженому процесі. Оскільки таблиця створюється в цьому процесі, коли вона повертається, цей процес зникає. І з процесом таблиця "до побачення".

У другому прикладі таблиця створюється процесом верхнього рівня. Потім він взаємодіє з ним в процесі породження. Таблиця доступна для процесу, в якому вона була створена, і для будь-якого процесу, який вона створює.

##tablesзламати це. Процес, в якому ##створена таблиця, буде процесом контролю. Таблиця не буде позначена для видалення, якщо цей процес все ще живий, навіть якщо проти цього процесу немає завдань. Після того, як процес, у якому ##була створена таблиця, зникає, таблиця помічається для видалення, коли проти неї виконується останнє завдання.

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


10

Локальні тимчасові таблиці бачать лише їх творці під час того самого підключення до екземпляра SQL Server, що і коли таблиці створювались вперше або на них посилалися. Місцеві тимчасові таблиці видаляються після того, як користувач від'єднується від екземпляра SQL Server. Глобальні тимчасові таблиці видимі для будь-якого користувача та будь-якого підключення після їх створення та видаляються, коли всі користувачі, які посилаються на таблицю, відключаються від екземпляра SQL Server.

Взято звідси

Більше про це


4

простий спосіб тестування #localtable and ##globaltable

Спробуйте це в іншому вікні запитів SQL

create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable

Спробуйте це в іншому вікні запитів SQL

create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable

Тепер, якщо ви запустите запит вибору для таблиці: #localtemptable у синтаксисі глобального вікна, ви отримаєте таке повідомлення про помилку: -

Invalid object name '#localtemptable'.

Поки ви запускаєте запит вибору для таблиці: ## globaltemptable у будь-якому вікні запиту тієї ж сесії, ви отримаєте результати запиту.


0

Таблиця буде видимою / доступною до завершення процесу / з'єднання, який її створив, і лише для сеансу, який її створив.

Таблиця є загальнодоступною і буде доступна кожному до завершення процесу / сеансу, який її створив.


0

"#" позначає місцеві тимчасові таблиці

  • Він починається з одного хеш-значення "#" як префікса назви таблиці.

  • Локальна тимчасова таблиця призначена лише для з'єднання, в якому вона була
    створена. Кожна локальна тимчасова таблиця має випадкове значення в кінці імені таблиці.

  • Місцева тимчасова таблиця автоматично скидається, коли існуюче з'єднання закрито, або користувач може явно скинути її за допомогою наступної команди "drop table #TempTable".

  • Якщо Тимчасова таблиця створюється в збереженій процедурі, вона автоматично скидається після завершення виконання збереженої процедури.

  • Ви можете створити локальну тимчасову таблицю з тим самим іменем, але в іншому з'єднанні, і вона зберігається з тим самим іменем разом із різними випадковими значеннями.

"##" позначає глобальні тимчасові таблиці

  • Він починається з одного хеш-значення "##" як префікса назви таблиці, і його назва завжди унікальна.
  • До назви не додається випадкове число. Загальні тимчасові таблиці видно для всіх підключень SQL Server.
  • Глобальні тимчасові таблиці руйнуються лише тоді, коли закрито останнє з'єднання, що посилається на таблицю (в якій ми створили Глобальну тимчасову таблицю).
  • Ви можете отримати доступ до глобальних тимчасових таблиць із усіх підключень SQL Server, поки посилання посилання не буде відкрите.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.