Поделиться через


GET CONVERSATION GROUP (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

[ WAITFOR ( ]  
   GET CONVERSATION GROUP @conversation_group_id  
      FROM <queue>  
[ ) ] [ , TIMEOUT timeout ]  
[ ; ]  
  
<queue> ::=  
{ database_name.schema_name.queue_name | schema_name.queue_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  
) ;  

B. Получение группы сообщений, ожидание — одна минута

В следующем примере в качестве значения @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 ;  

C. Получение группы сообщений, немедленное возвращение

В следующем примере в качестве значения @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)