GET CONVERSATION GROUP (Transact-SQL)

適用対象:SQL ServerAzure SQL Managed Instance

次に受信するメッセージのメッセージ交換グループの識別子を返すと共に、そのメッセージが含まれるメッセージ交換のメッセージ交換グループをロックします。 メッセージ交換グループの識別子は、メッセージ自体を取得する前にメッセージ交換の状態情報を取得する場合に使用できます。

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 文で返される会話グループIDを格納する変数です。 この変数は、uniqueidentifier 型である必要があります。 使用できるメッセージ交換グループがない場合、この変数は NULL に設定されます。

FROM
メッセージ交換グループを取得するキューを指定します。

database_name
メッセージ交換グループを取得するキューが含まれているデータベースの名前を指定します。 database_name を指定しない場合、既定では現在のデータベースが使用されます。

schema_name
メッセージ交換グループを取得するキューを所有するスキーマの名前を指定します。 schema_name を指定しない場合、既定では現在のユーザーに関する既定のスキーマが使用されます。

queue_name
メッセージ交換グループを取得するキューの名前を指定します。

タイムアウト タイムアウト
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 権限を持っている必要があります。

A. 無制限に待機して、メッセージ交換グループを取得する

次の例では、@conversation_group_id にメッセージ交換グループの識別子を設定します。このメッセージ交換グループは、ExpenseQueue 上にあり、次に使用できるメッセージで使用されます。 このコマンドは、メッセージが使用できるようになるまで待機します。

DECLARE @conversation_group_id UNIQUEIDENTIFIER ;  
  
WAITFOR (  
 GET CONVERSATION GROUP @conversation_group_id  
     FROM ExpenseQueue  
) ;  

B. 1 分間待機して、メッセージ交換グループを取得する

次の例では、@conversation_group_id にメッセージ交換グループの識別子を設定します。このメッセージ交換グループは、ExpenseQueue 上にあり、次に使用できるメッセージで使用されます。 1分以内にメッセージが出ない場合は、@conversation_group_idの値を変えずにGET CONVERSATION GROUP戻ります。

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)