Локальные и глобальные временные таблицы в SQL Server - PullRequest
136 голосов
/ 27 мая 2010

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

Ответы [ 5 ]

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

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

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

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

104 голосов
/ 27 мая 2010

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

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

11 голосов
/ 04 декабря 2015

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 подключение.

11 голосов
/ 27 мая 2010

Цитирование из Книг Онлайн:

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

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

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

Стоит отметить, что есть также: глобальные временные таблицы в области базы данных (в настоящее время поддерживается только базой данных 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'
...