Share via


キューに対するクエリの実行

場合によって、キュー全体のコンテンツを調べる必要が生じることがあります。たとえば、キューに格納されているメッセージの数を知りたい場合や、サービスをオフラインにする前にそのサービスに対するすべてのメッセージがアプリケーションで処理済みかどうかを確認したい場合です。メッセージがアプリケーションで処理されない場合に、原因を究明しなければならないこともあります。

この情報を取得するには、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 では、ユーザーがキューにインデックスを作成することはできません。