У чому різниця між SQL Server #temptable
та ##TempTable
SQL Server?
У чому різниця між SQL Server #temptable
та ##TempTable
SQL Server?
Відповіді:
#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
зламати це. Процес, в якому ##
створена таблиця, буде процесом контролю. Таблиця не буде позначена для видалення, якщо цей процес все ще живий, навіть якщо проти цього процесу немає завдань. Після того, як процес, у якому ##
була створена таблиця, зникає, таблиця помічається для видалення, коли проти неї виконується останнє завдання.
Ось простий спосіб це побачити. #
таблиці доступні лише в обсязі процесу, в якому він був створений. ##
Доступні так само, як і будь-яка інша таблиця, за винятком того, що існування виникає та йде разом із процесом, в якому було створено.
Локальні тимчасові таблиці бачать лише їх творці під час того самого підключення до екземпляра SQL Server, що і коли таблиці створювались вперше або на них посилалися. Місцеві тимчасові таблиці видаляються після того, як користувач від'єднується від екземпляра SQL Server. Глобальні тимчасові таблиці видимі для будь-якого користувача та будь-якого підключення після їх створення та видаляються, коли всі користувачі, які посилаються на таблицю, відключаються від екземпляра SQL Server.
простий спосіб тестування #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 у будь-якому вікні запиту тієї ж сесії, ви отримаєте результати запиту.
"#" позначає місцеві тимчасові таблиці
Він починається з одного хеш-значення "#" як префікса назви таблиці.
Локальна тимчасова таблиця призначена лише для з'єднання, в якому вона була
створена. Кожна локальна тимчасова таблиця має випадкове значення в кінці імені таблиці.
Місцева тимчасова таблиця автоматично скидається, коли існуюче з'єднання закрито, або користувач може явно скинути її за допомогою наступної команди "drop table #TempTable".
Якщо Тимчасова таблиця створюється в збереженій процедурі, вона автоматично скидається після завершення виконання збереженої процедури.
Ви можете створити локальну тимчасову таблицю з тим самим іменем, але в іншому з'єднанні, і вона зберігається з тим самим іменем разом із різними випадковими значеннями.
"##" позначає глобальні тимчасові таблиці