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

В чем разница между локальными и глобальными временными таблицами в SQL Server?

Ответ 1

Я нахожу это объяснение достаточно ясным (это чистая копия из Technet):

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

Ответ 2

  • Переменные таблицы (DECLARE @t TABLE) видны только соединению, которое его создает, и удаляются при завершении пакетной или хранимой процедуры.

  • Локальные временные таблицы (CREATE TABLE #t) видны только для соединение, которое его создает, и удаляется, когда соединение закрыты.

  • Глобальные временные таблицы (CREATE TABLE ##t) видны всем, и удаляются, когда все связанные с ними соединения закрыты.

  • Текущие таблицы Tempdb (USE tempdb CREATE TABLE t) видны каждый, и удаляются при перезапуске сервера.

Ответ 3

Цитата из онлайн-книг:

Локальные временные таблицы видны только в текущем сеансе; глобальные временные таблицы видны для всех сеансов.

Временные таблицы автоматически отбрасываются, когда они выходят за пределы области видимости, если явно не удалены с помощью DROP TABLE:

  • Локальная временная таблица, созданная в хранимой процедуре, автоматически отбрасывается при завершении хранимой процедуры. На таблицу можно ссылаться любые вложенные хранимые процедуры, выполняемые хранимой процедурой, которая создала таблицу. На таблицу не может ссылаться процесс, который называется хранимой процедурой, которая создала таблицу.
  • Все остальные локальные временные таблицы автоматически отбрасываются в конце текущего сеанса.
  • Глобальные временные таблицы автоматически удаляются, когда сеанс, который создал таблицу, заканчивается, и все остальные задачи перестали ссылаться на них. Связь между задачей и таблицей поддерживается только для жизни одного оператора Transact-SQL. Это означает, что глобальная временная таблица отбрасывается при завершении последнего оператора Transact-SQL, который активно ссылался на таблицу при завершении сеанса создания.

Ответ 4

1.) Локальная временная таблица существует только для продолжительности соединения или, если она определена внутри составного оператора, на протяжении всего составного оператора.

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

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

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


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

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

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

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

Ответ 5

Стоит отметить, что есть также: глобальные временные таблицы в области базы данных(в настоящее время поддерживается только базой данных SQL Azure).

Глобальные временные таблицы для SQL Server (инициируемые с помощью имени таблицы ##) хранятся в базе данных tempdb и используются всеми сеансами пользователей для всего экземпляра SQL Server.

База данных SQL Azure поддерживает глобальные временные таблицы, которые также хранятся в базе данных tempdb и находятся на уровне базы данных. Это означает, что глобальные временные таблицы являются общими для всех сеансов пользователей в одной базе данных SQL Azure. Сеансы пользователей из других баз данных не могут получить доступ к глобальным временным таблицам.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

Ответ 6

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

временные таблицы доступны только в том сеансе, в котором они были созданы.

Глобальные временные таблицы: Иногда вам может понадобиться создать временную таблицу, доступную другим соединениям. В этом случае вы можете использовать глобальные временные таблицы.

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