Возвращающие табличное значение параметры (компонент Database Engine)

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

Возвращающие табличные значения параметры похожи на массивы параметров в OLE DB и ODBC, но они обеспечивают большую гибкость и больше интегрированы с Transact-SQL. Преимуществом возвращающих табличные значения параметров также является возможность участия в операциях, основанных на наборах.

ПримечаниеПримечание

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

Можно создавать и выполнять процедуры Transact-SQL с возвращающими табличные значения параметрами и вызывать их из кода Transact-SQL, управляемых и собственных клиентов на любом управляемом языке.

Создание и использование возвращающих табличные значения параметров в Transact-SQL

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

  1. Создайте табличный тип и определите структуру таблицы.

    Дополнительные сведения о создании типа SQL Server см. в разделе Определяемые пользователем типы таблиц. Дополнительные сведения о задании структуры таблицы см. в разделе Инструкция CREATE TABLE (Transact-SQL).

  2. Объявите процедуру, имеющую параметр типа table. Дополнительные сведения о процедурах SQL Server см. в разделах CREATE PROCEDURE (Transact-SQL) и CREATE FUNCTION (Transact-SQL).

  3. Объявите переменную типа table и создайте ссылку на тип table. Сведения об объявлении переменных см. в разделе DECLARE @local_variable (Transact-SQL).

  4. Заполните переменную типа table с помощью инструкции INSERT. Дополнительные сведения о вставке данных см. в разделе Добавление строк с помощью инструкций INSERT и SELECT.

  5. После создания переменной типа table ее можно передать процедуре.

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

Сведения об использовании возвращающих табличные значения параметров в собственном клиенте SQL Server см. в разделе Параметры, возвращающие табличное значение (собственный клиент SQL Server).

Сведения об использовании возвращающих табличные значения параметров в ADO.NET см. в документации по ADO.NET.

Преимущества

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

  • Не запрашивают блокировки для первичного заполнения данными от клиента.

  • Предоставляют простую модель программирования.

  • Позволяют включать в одиночную процедуру сложную бизнес-логику.

  • Сокращают количество циклов приема-передачи с сервером.

  • Могут иметь структуру таблицы с другим количеством элементов.

  • Строго типизированы.

  • Позволяют клиенту указать порядок сортировки и уникальные ключи.

Ограничения

Возвращающие табличные значения параметры имеют следующие ограничения.

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

  • Возвращающие табличные значения параметры должны передаваться процедурам Transact-SQL как входные параметры типа READONLY. Над возвращающими табличные значения параметрами, находящимися в теле процедуры, нельзя выполнять операции DML, такие как UPDATE, DELETE или INSERT.

  • Возвращающий табличное значение параметр не может быть использован в качестве цели для инструкции SELECT INTO или INSERT EXEC. Возвращающий табличное значение параметр может присутствовать в предложении FROM инструкции SELECT INTO или в строке или хранимой процедуре INSERT EXEC.

Область действия

Область действия возвращающего табличное значение параметра такая же, как и у других параметров — хранимая процедура, функция или динамический текст Transact-SQL. Аналогично область действия у переменной типа table точно такая же, как и у любой другой переменной, созданной с помощью инструкции DECLARE. Возвращающие табличные значения переменные можно объявлять в динамических инструкциях Transact-SQL, а затем передавать эти переменные как возвращающие табличные значения параметры хранимым процедурам и функциям.

Безопасность

Разрешения для возвращающих табличные значения параметров следуют модели безопасности объектов SQL Server с помощью ключевых слов Transact-SQL: CREATE, GRANT, DENY, ALTER, CONTROL, TAKE OWNERSHIP, REFERENCES, EXECUTE, VIEW DEFINITION и REVOKE.

Представления каталога

Чтобы получить сведения, связанные с возвращающими табличные значения параметрами, можно выполнить запрос к следующим представлениям каталога: sys.parameters (Transact-SQL), sys.types (Transact-SQL) и sys.table_types (Transact-SQL).

Возвращающие табличные значения параметры и операции BULK INSERT

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

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

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

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

Источник данных

Логика сервера

Число строк

Лучшая технология

Форматированный файл данных на сервере

Прямая вставка

< 1000

BULK INSERT

Форматированный файл данных на сервере

Прямая вставка

> 1000

BULK INSERT

Форматированный файл данных на сервере

Сложный

< 1000

Возвращающие табличные значения параметры

Форматированный файл данных на сервере

Сложный

> 1000

BULK INSERT

Процесс удаленного клиента

Прямая вставка

< 1000

Возвращающие табличные значения параметры

Процесс удаленного клиента

Прямая вставка

> 1000

BULK INSERT

Процесс удаленного клиента

Сложный

< 1000

Возвращающие табличные значения параметры

Процесс удаленного клиента

Сложный

> 1000

Возвращающие табличные значения параметры

Примеры

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

USE AdventureWorks2008R2;
GO

/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
    @TVP LocationTableType READONLY
    AS 
    SET NOCOUNT ON
    INSERT INTO [AdventureWorks2008R2].[Production].[Location]
           ([Name]
           ,[CostRate]
           ,[Availability]
           ,[ModifiedDate])
        SELECT *, 0, GETDATE()
        FROM  @TVP;
        GO

/* Declare a variable that references the type. */
DECLARE @LocationTVP 
AS LocationTableType;

/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
    SELECT [Name], 0.00
    FROM 
    [AdventureWorks2008R2].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO