GET CONVERSATION GROUP (Transact-SQL)
Возвращает идентификатор группы сообщений для следующего получаемого сообщения и блокирует группу сообщений для диалога, содержащего сообщение. Идентификатор группы сообщений может использоваться для получения сведений о состоянии диалога до получения непосредственно самого сообщения.
Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии). |
Cинтаксические обозначения в 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 ;