キューに対するクエリの実行
場合によって、キュー全体のコンテンツを調べる必要が生じることがあります。たとえば、キューに格納されているメッセージの数を知りたい場合や、サービスをオフラインにする前にそのサービスに対するすべてのメッセージがアプリケーションで処理済みかどうかを確認したい場合です。メッセージがアプリケーションで処理されない場合に、原因を究明しなければならないこともあります。
この情報を取得するには、SELECT ステートメントのソース テーブルとしてキューの名前を使用します。キューに関する SELECT ステートメントは、ビューまたはテーブルに関する SELECT ステートメントと同じ形式です。
注 |
---|
Service Broker は、複数のキュー リーダーでキューから効率的にメッセージを受け取るように設計されています。ただし、キューに関する SELECT ステートメントがブロッキングを引き起こす可能性があります。キューに対して SELECT ステートメントを使用する場合は、NOLOCK ヒントを指定して、キューを使用するアプリケーションのブロッキングを回避してください。 |
キュー内の列の詳細については、「CREATE QUEUE (Transact-SQL)」を参照してください。
次に示すのは、キュー ExpenseQueue 内のメッセージの数を調べるための SELECT ステートメントの例です。
SELECT COUNT(*) FROM dbo.ExpenseQueue WITH (NOLOCK) ;
次の SELECT ステートメントを使用すると、管理者はキュー ExpenseQueue にサービス //Adventure-Works.com/AccountsPayable/Expenses へのメッセージが含まれているかどうかを調べることができます。
IF EXISTS(SELECT * FROM dbo.ExpenseQueue WITH (NOLOCK) WHERE
service_name = '//Adventure-Works.com/AccountsPayable/Expenses')
PRINT 'The queue contains messages for ' +
'//Adventure-Works.com/AccountsPayable/Expenses'
ELSE
PRINT 'The queue does not contain messages for ' +
'//Adventure-Works.com/AccountsPayable/Expenses' ;
Service Broker はキューの更新を管理します。SELECT ステートメントではテーブル名の代わりにキューの名前を指定することができますが、キューは INSERT、UPDATE、DELETE、または TRUNCATE ステートメントの対象にはなりません。SQL Server では、ユーザーがキューにインデックスを作成することはできません。