GET CONVERSATION GROUP (Transact-SQL)

Возвращает идентификатор группы сообщений для следующего получаемого сообщения и блокирует группу сообщений для диалога, содержащего сообщение. Идентификатор группы сообщений может использоваться для получения сведений о состоянии диалога до получения непосредственно самого сообщения.

Значок ссылки на разделСинтаксические обозначения в 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 AdventureWorks2008R2.dbo.ExpenseQueue ;