Подтвердить что ты не робот

Разница между #temptable и ## TempTable?

Можете ли вы объяснить разницу между #temptable и ##TempTable в SQL Server. Я гуглил об этом, но не могу найти ответы.

Пожалуйста, помогите мне в этом

4b9b3361

Ответ 1

Локальные временные таблицы

Локальные таблицы temp доступны только для текущего соединения для пользователь; и они автоматически удаляются, когда пользователь отключается от экземпляров. Локальное временное имя таблицы устаревает с хешем ( "#" ) знак.

Пример:

CREATE TABLE #LocalTempTable(
UserID int,
UserName varchar(50), 
UserAddress varchar(150))

область локальной временной таблицы ограничена только текущим подключением текущего пользователя .

Глобальные временные таблицы

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

Пример:

CREATE TABLE ##NewGlobalTempTable(
UserID int,
UserName varchar(50), 
UserAddress varchar(150))

Глобальные временные таблицы видны для всех подключений SQL Server. Когда вы создаете один из них, все пользователи могут видеть его.

Vignesh вы можете узнать больше об этом здесь

Ответ 2

#table относится к локальной временной таблице - виден только пользователю, который ее создал

##table относится к глобальной временной таблице - видимой для всех пользователей.

Ответ 3

#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 ломают это. Процесс, в котором создается таблица ## будет управляющим процессом. Таблица не будет помечена для удаления, если этот процесс еще активен, даже если нет задач против этого процесса. Когда процесс, в котором была создана таблица ##, исчезает, таблица помечается для удаления, когда для нее выполняется последняя задача.

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

Ответ 4

Локальные временные таблицы видны только их создателям при том же подключении к экземпляру SQL Server, что и при первом создании или обращении к таблицам. Локальные временные таблицы удаляются после того, как пользователь отключается от экземпляра SQL Server. Глобальные временные таблицы видны любому пользователю и любому соединению после их создания и удаляются, когда все пользователи, ссылающиеся на таблицу, отключаются от экземпляра SQL Server.

 Взято отсюда

 Подробнее об этом

Ответ 5

Вот еще один быстрый взгляд на SQL Temporary Tables, если вы хотите google, вы можете узнать больше об этом

Локальная таблица темпа

Локальные временные таблицы доступны только для текущего подключения для пользователя; и они автоматически удаляются, когда пользователь отключается от экземпляров. Локальное временное имя таблицы отображается с символом "хэш" ( "#" ).

Глобальная таблица темпов

Имя глобального временного таблиц начинается с двойного хэша ( "##" ). После того, как эта таблица была создана соединением, как постоянная таблица, она доступна любому пользователю любым подключением. Его можно удалить только после закрытия всех соединений.

Оба, временные таблицы хранятся во временной папке tempdb. Всякий раз, когда мы создаем временную таблицу, она переходит в временную папку базы данных tempdb.

Временная таблица с определенным идентификатором

enter image description here

Когда вы создаете таблицу Temp, SQL-сервер создает имя таблицы вместе с определенным идентификатором, поэтому он не сталкивается с другим именем таблицы Table

в основном из

Ответ 6

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

Ответ 7

Таблицы #temp доступны ТОЛЬКО для сеанса, который их создал, и удаляются при закрытии сеанса.

## временные таблицы (глобальные) доступны для ВСЕХ сеансов, но по-прежнему удаляются, когда сеанс, который их создал, закрыт и все другие ссылки на них закрыты.

Ответ 8

Таблица будет видимой/доступной до тех пор, пока не завершится процесс/соединение, которое ее создало, и только в сеансе, который ее создал.

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