查询队列

适用于:SQL ServerAzure SQL 托管实例

有时可能需要将队列的内容作为一个整体来检查。 您可能想要了解队列中包含多少条消息,或者可能需要确保应用程序已处理您将要脱机的某个服务的所有消息。 您可能需要找出应用程序不处理消息的原因。

若要获取此信息,请将队列的名称用作 SELECT 语句的源表。 针对队列的 SELECT 语句的格式与针对视图或表的 SELECT 语句的格式相同。

注意

Service Broker 设计为支持多个队列读取器高效地从一个队列接收消息。 但是,针对队列的 SELECT 语句可能引起阻塞。 当对队列使用 SELECT 语句时,请指定 NOLOCK 提示,以避免阻塞使用该队列的应用程序。有关队列中列的说明,请参阅 CREATE QUEUE (Transact-SQL)

下面的 SELECT 语句示例用于确定队列 ExpenseQueue 中的消息数:

    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 不允许用户对队列创建索引。

另请参阅

SELECT (Transact-SQL)队列

消息保留期