Временные таблицы SQL Server

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

Временные таблицы — это таблицы, которые временно существуют на SQL Server.

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

Создание временных таблиц

SQL Server предоставляет два способа создания временных таблиц с помощью операторов SELECT INTO и CREATE TABLE.

Создание временных таблиц с помощью оператора SELECT INTO

Первый способ создания временной таблицы — использование оператора SELECT INTO, как показано ниже:

SELECT 
    select_list
INTO 
    temporary_table
FROM 
    table_name
....

Имя временной таблицы начинается с символа решетки(#). Например, следующий оператор создает временную таблицу с помощью оператора SELECT INTO:

SELECT
    product_name,
    list_price
INTO #trek_products --- temporary table
FROM
    production.products
WHERE
    brand_id = 9;

В этом примере мы создали временную таблицу с именем #trek_products с двумя столбцами, полученными из списка выбора оператора SELECT. Оператор создал временную таблицу и заполнил ее данными из таблицы production.products.

После выполнения оператора вы сможете найти имя временной таблицы, созданной в системной базе данных с именем tempdb, доступ к которой можно получить через SQL Server Management Studio, используя следующий путь Системные базы данных > tempdb > Временные таблицы, как показано на следующем рисунке:

Пример временных таблиц SQL Server

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

Создайте временные таблицы с помощью оператора CREATE TABLE

Второй способ создания временной таблицы — использование оператора CREATE TABLE:

CREATE TABLE #haro_products(
    product_name VARCHAR(MAX),
    list_price DEC(10,2)
);

Этот оператор имеет тот же синтаксис, что и создание обычной таблицы. Однако имя временной таблицы начинается с символа решетки(#)

После создания временной таблицы вы можете вставлять данные в эту таблицу как в обычную таблицу:

INSERT INTO #haro_products
SELECT
    product_name,
    list_price
FROM 
    production.products
WHERE
    brand_id = 2;

Конечно, вы можете запросить данные по нему в рамках текущего сеанса:

SELECT
    *
FROM
    #haro_products;

Временные таблицы SQL Server — Запрос данных

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

Invalid object name '#haro_products'.

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

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

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

В отличие от временной таблицы, имя глобальной временной таблицы начинается с двойного символа решетки(##).

Следующие операторы сначала создают глобальную временную таблицу с именем ##heller_products, а затем заполняют эту таблицу данными из таблицы production.products:

CREATE TABLE ##heller_products(
    product_name VARCHAR(MAX),
    list_price DEC(10,2)
);
INSERT INTO ##heller_products
SELECT
    product_name,
    list_price
FROM 
    production.products
WHERE
    brand_id = 3;

Теперь вы можете получить доступ к таблице ##heller_products из любого сеанса.

Удаление временных таблиц

Автоматическое удаление

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

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

Удаление вручную

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

DROP TABLE ##table_name;

В этом руководстве вы узнали о временных таблицах SQL Server и о том, как эффективно их создавать и удалять.

Мирослав С.

Автор статей, ИБ-специалист