sp_getbindtoken (Transact-SQL)
Возвращает уникальный идентификатор для транзакции. Этот уникальный идентификатор является строкой, используемой для привязки сеансов при помощи процедуры sp_bindsession.
Важно! |
---|
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Используйте режим MARS или распределенные транзакции. Дополнительные сведения см. в разделе Использование режима MARS или Распределенные транзакции (компонент Database Engine). |
Синтаксис
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