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

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

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

5 ответов

Решение

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

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

Пример:

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 Kumar A вы можете узнать больше об этом здесь

`#table относится к локальной (видимой только пользователю, создавшему ее) временной таблице.'

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

TempTables не являются локальными для пользователя или соединения. Они являются локальными для процесса, который его создал, и любых процессов, которые создает процесс создания. Например, у меня есть следующее:

Объявите @strDynamicSQL как varchar(8000)

Установить @strDynamicSQL = 'Выбрать GetDate() как TheDate Into #TheDateTable' Выполнить (@strDynamicSQL)

Выберите * из #TheDateTable

Я получаю следующую ошибку: сообщение 208, уровень 16, состояние 0, строка 7 Неверное имя объекта "#TheDateTable".

Но если я сделаю:

Объявите @strDynamicSQL как varchar(8000)

Создать таблицу #TheDateTable (TheDate DateTime)

Set @strDynamicSQL = 'Вставить в #TheDateTable Выбрать GetDate() As TheDate' Выполнить (@strDynamicSQL)

Выберите * из #TheDateTable

Я не получаю ошибок.

В первом примере оператор "Выполнить" происходит в порожденном процессе. Поскольку таблица создается в этом процессе, когда она возвращается, этот процесс исчезает. И с процессом таблица "пока-пока".

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

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

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

Локальные временные таблицы видны только их создателям при том же подключении к экземпляру 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".

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

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

"##" обозначает глобальные временные таблицы

  • Он начинается с единственного хеш-значения "##" в качестве префикса имени таблицы, и его имя всегда уникально.
  • К имени не добавляется случайное число. Глобальные временные таблицы видны для всех подключений SQL Server.
  • Глобальные временные таблицы уничтожаются только тогда, когда закрывается последнее соединение, ссылающееся на таблицу (в которой мы создали глобальную временную таблицу).
  • Вы можете получить доступ к глобальным временным таблицам из всех подключений SQL Server, пока не будет открыто ссылочное соединение.

Вот еще один быстрый взгляд на временные таблицы SQL, если бы вы Google, вы могли бы узнать больше об этом

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

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

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

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

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

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

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

в основном получены из

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

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

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

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

Другие вопросы по тегам