sp_getbindtoken (Transact-SQL)

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

Важное примечаниеВажно!

В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Используйте режим MARS или распределенные транзакции. Дополнительные сведения см. в разделе Использование режима MARS или Распределенные транзакции (компонент Database Engine).

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

sp_getbindtoken [@out_token =] 'return_value' OUTPUT 

Аргументы

  • [@out_token =]'return_value'
    Маркер, используемый для привязки сеансов. Аргумент return_value имеет тип varchar(255) и не имеет значения по умолчанию.

Значения кодов возврата

Нет

Результирующие наборы

Нет

Замечания

В SQL Server 2000 и в более поздних версиях процедура sp_getbindtoken возвращает действительный маркер, если только хранимая процедура выполняется внутри активной транзакции. В противном случае компонент Database Engine возвращает сообщение об ошибке. Например:

-- Declare a variable to hold the bind token.
-- No active transaction.
DECLARE @bind_token varchar(255);
-- Trying to get the bind token returns an error 3921.
EXECUTE sp_getbindtoken @bind_token OUTPUT;
Server: Msg 3921, Level 16, State 1, Procedure sp_getbindtoken, Line 4
Cannot get a transaction token if there is no transaction active.
Reissue the statement after a transaction has been started.
ПримечаниеПримечание

В версии SQL Server 7.0 процедура sp_getbindtoken возвращает действительный маркер, даже если хранимая процедура выполняется вне активной транзакции. Предыдущий пример работает в SQL Server 7.0, но не в SQL Server 2000 или в более поздних версиях.

Если процедура sp_getbindtoken используется для прикрепления соединения распределенной транзакции к открытой транзакции, SQL Server 2000 или более поздняя версия возвращает тот же маркер. Например:

USE AdventureWorks;
GO
DECLARE @bind_token varchar(255);

BEGIN TRAN;

EXECUTE sp_getbindtoken @bind_token OUTPUT;
SELECT @bind_token AS Token;

BEGIN DISTRIBUTED TRAN;

EXECUTE sp_getbindtoken @bind_token OUTPUT;
SELECT @bind_token AS Token;

Обе инструкции SELECT возвращают один и тот же маркер:

Token
-----
PKb'gN5<9aGEedk_16>8U=5---/5G=--
(1 row(s_) affected)

Token
-----
PKb'gN5<9aGEedk_16>8U=5---/5G=--
(1 row(s_) affected)

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

Для получения и передачи маркера привязки необходимо выполнить процедуру sp_getbindtoken перед выполнением процедуры sp_bindsession для использования общего пространства блокировок. Если получен маркер привязки, процедура sp_bindsession выполняется правильно.

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

Для получения маркера привязки для использования из расширенной хранимой процедуры рекомендуется использовать интерфейс прикладного программирования (API) Open Data Services процедуры srv_getbindtoken.

Разрешения

Необходимо членство в роли public.

Примеры

Следующий пример демонстрирует получение маркера привязки и отображает имя маркера привязки.

DECLARE @bind_token varchar(255);
BEGIN TRAN;
EXECUTE sp_getbindtoken @bind_token OUTPUT;
SELECT @bind_token AS Token;

Ниже приводится результирующий набор.

Token
----------------------------------------------------------
\0]---5^PJK51bP<1F<-7U-]ANZ