GET CONVERSATION GROUP (Transact-SQL)
Возвращает идентификатор группы сообщений для следующего получаемого сообщения и блокирует группу сообщений для диалога, содержащего сообщение. Идентификатор группы сообщений может использоваться для получения сведений о состоянии диалога до получения непосредственно самого сообщения.
Синтаксис
[ WAITFOR ( ]
GET CONVERSATION GROUP @conversation_group_id
FROM <queue>
[ ) ] [ , TIMEOUT timeout ]
[ ; ]
<queue> ::=
{
[ database_name . [ schema_name ] . | schema_name . ] queue_name
}
Аргументы
- WAITFOR
Указывает, что инструкция GET CONVERSATION GROUP ожидает поступления сообщения в очередь, если в настоящий момент сообщения отсутствуют.
- @conversation_group_id
Переменная, которая используется для хранения идентификатора группы сообщений, возвращенных инструкцией GET CONVERSATION GROUP. Переменная должна принадлежать к типу uniqueidentifier. Если нет доступных групп диалогов, переменной присваивается значение NULL.
- FROM
Указывает очередь, из которой должна быть получена группа сообщений.
- database_name
Имя базы данных, содержащей очередь, из которой должна быть получена группа сообщений. Если значение database_name не указано, по умолчанию используется текущая база данных.
- schema_name
Имя схемы, владеющей очередью, из которой должна быть получена группа сообщений. Если значение schema_name не указано, используется схема по умолчанию для текущего пользователя.
- queue_name
Имя очереди, из которой должна быть получена группа сообщений.
- TIMEOUT timeout
Указывает продолжительность времени (в миллисекундах), в течение которого компонент Service Broker ожидает поступления сообщения в очередь. Это предложение может быть использовано только вместе с предложением WAITFOR. Если инструкция, использующая WAITFOR, не включает в себя этого предложения или значение timeout равно -1, то время ожидания не ограничено. Если время ожидания истекает, GET CONVERSATION GROUP присваивает переменной @conversation_group_id значение NULL.
Замечания
Важно! |
---|
Если инструкция GET CONVERSATION GROUP не является первой инструкцией в групповой операции или хранимой процедуре, окончание текста предыдущей инструкции должно быть отмечено при помощи точки с запятой (;), символом окончания текста инструкции в языке Transact-SQL. |
Если очередь, указанная в инструкции GET CONVERSATION GROUP, недоступна, инструкция выдает ошибку языка Transact-SQL.
Эта инструкция возвращает следующую группу сообщений, которая содержит доступные сообщения и может быть успешно заблокирована соединением. Следовательно, успешные вызовы GET CONVERSATION GROUP в пределах той же транзакции могут заблокировать несколько групп сообщений. Если нет доступных групп сообщений, инструкция возвращает значение NULL в качестве идентификатора группы сообщений.
Если указано предложение WAITFOR, инструкция ожидает либо в течение указанного времени ожидания, либо до появления доступной группы сообщений. Если очередь удаляется в то время как инструкция находится в ожидании, инструкция немедленно возвращает ошибку.
GET CONVERSATION GROUP недействительна в пользовательской функции.
Разрешения
Для получения идентификатора группы сообщений из очереди текущий пользователь должен иметь для очереди разрешение RECEIVE.
Примеры
А. Получение группы сообщений, ожидание не определено
В этом примере в качестве значения @conversation_group_id используется идентификатор группы сообщений для следующего доступного сообщения в ExpenseQueue. Команда ожидает, пока сообщение не станет доступным.
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
WAITFOR (
GET CONVERSATION GROUP @conversation_group_id
FROM ExpenseQueue
) ;
Б. Получение группы сообщений, ожидание одна минута
В этом примере в качестве значения @conversation_group_id используется идентификатор группы сообщений для следующего доступного сообщения в ExpenseQueue. Если в течение одной минуты не появится доступного сообщения, GET CONVERSATION GROUP возвращает без изменения значение @conversation_group_id.
DECLARE @conversation_group_id UNIQUEIDENTIFIER
WAITFOR (
GET CONVERSATION GROUP @conversation_group_id
FROM ExpenseQueue ),
TIMEOUT 60000 ;
С. Получение группы сообщений, немедленное возвращение
В этом примере в качестве значения @conversation_group_id используется идентификатор группы сообщений для следующего доступного сообщения в ExpenseQueue. Если доступных сообщений нет, GET CONVERSATION GROUP возвращает немедленно без изменения значение @conversation_group_id.
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
GET CONVERSATION GROUP @conversation_group_id
FROM AdventureWorks.dbo.ExpenseQueue ;
См. также
Справочник
BEGIN DIALOG CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)