Подтвердить что ты не робот

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

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

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


Вопросы:

  • Правда ли, что временная таблица будет разделяться, если одновременно запустить два разных импорта?
  • Каждый вызов EXEC создает новую область?

Вот надуманный пример script.

CREATE PROC [dbo].[ImportCompany]
(
    @CompanyId AS INTEGER
)
AS
EXEC [dbo].[ImportAddress] @CompanyId = @CompanyId 
--Import other data

CREATE PROC [dbo].[ImportAddress]
(
    @CompanyId AS INTEGER
)
AS
    CREATE TABLE #Companies (OldAddress NVARCHAR(128), NewAddress NVARCHAR(128))
    INSERT INTO #Companies(OldAddress, NewAddress)
    SELECT
        Address as OldAddress,
        'Transformed ' + Address as NewAddress
    FROM
        [OldDb].[dbo].[Addresses]
    WHERE
        CompanyId = @CompanyId

    --Do stuff with the transformed data

    DROP TABLE #Companies

EXEC [dbo].[ImportCompany] @CompanyId = 12345
4b9b3361

Ответ 1

Из CREATE TABLE:

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

и (что более важно):

Если локальная временная таблица создается в хранимой процедуре или приложении, которые могут выполняться одновременно несколькими пользователями, то механизм Database Engine должен иметь возможность отличать таблицы, созданные разными пользователями. Механизм Database делает это, внутренне добавляя числовой суффикс к каждому имени локальной временной таблицы.

Что конкретно объясняет, кто бы сказал, что они будут разделены.


Кроме того, нет необходимости DROP TABLE в конце вашей процедуры (опять же):

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

Ответ 2

## используется для глобальных временных таблиц - будет доступен для разных импортов.

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

Ответ 3

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

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