Главная » Microsoft SQL Server, Базы данных » Временные таблицы и табличные переменные

0

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

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

Локальные таблицы создаются точно так же, как и обычные, за исключением того, что их имя должно начинаться с символа решетки (#). Временные таблицы фактически создаются на диске в базе данных tempdb:

CREATE TABLE #ProductTemp (

ProductID INT PRIMARY KEY ) ;

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

Область определения временной таблицы также ограничена— ее может видеть только создавшее ее подключение. Даже если тысяча пользователей создаст временные таблицы с одним и тем же именем, каждый из них будет видеть только свою. Причина этого заключается в том, что физически временные таблицы создаются в базе данных tempdb с именем, состоящим из указанного пользователем, и идентификатора подключения. Имена большинства объектов могут иметь до 128 символов, но временные таблицы ограничены только сто шестнадцатью, поскольку последние 12 символов используются для идентификации подключения. Продемонстрируем это на примере. В предлагаемом сценарии создается временная таблица, а затем ее имя извлекается из таблицы sysObj ects:

SELECT Name

FROM TempDB.dbo.SysObjects WHERE Name Like ‘#Pro%1;

Результат показан в сокращенном виде, так как на самом деле реальное значение имеет длину в 128 символов:

Name

#ProductTemp______________________________________ 0 000000000 2D

Несмотря на присваиваемое сервером длинное имя, в запросах используется только его часть, заданная пользователем.

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

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

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

IF NOT EXISTS(

SELECT * FROM Tempdb.dbo.Sysobjects WHERE Name = ‘##TempWork1)

CREATE TABLE ##TempWork(

PK INT,

Coll INT

) ;

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

Табличные переменные

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

?               Они не могут быть созданы с использованием синтаксиса SELECT * INTO или INSERT INTO.

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

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

?               Табличные’переменные не могут иметь зависимых объектов, таких как триггеры и внешние ключи.

Табличные переменные объявляются как обычные, а не создаются с помощью инструкций SQL DDL. Когда на табличную переменную ссылается запрос, обращение к ней происходит как к таблице, однако именуется она как переменная. Следующий сценарий должен быть выполнен как единый пакет или завершиться ошибкой:

DECLARE @WorkTable TABLE (

РК INT PRIMARY KEY,

Coll INT NOT NULL);

INSERT INTO ©WorkTable (PK, Coll)

VALUES ( 1, 101);

SELECT PK, Coll

FROM @WorkTable;

Будет получен следующий результат:

РК      Coll

1 101

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии