GET CONVERSATION GROUP (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance
次に受信するメッセージのメッセージ交換グループの識別子を返すと共に、そのメッセージが含まれるメッセージ交換のメッセージ交換グループをロックします。 メッセージ交換グループの識別子は、メッセージ自体を取得する前にメッセージ交換の状態情報を取得する場合に使用できます。
構文
[ 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
メッセージ交換グループを取得するキューの名前を指定します。
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 権限を持っている必要があります。
例
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 分以内に取得できない場合、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)