使用 WAITFOR

WAITFOR 语句挂起批处理、存储过程或事务的执行,直到发生以下情况:

  • 已超过指定的时间间隔。

  • 到达一天中指定的时间。

  • 指定的 RECEIVE 语句至少修改一行或并将其返回到 Service Broker 队列。

实际的时间延迟可能随着指定的时间而变化,并取决于服务器的活动级别。时间计数器在计划完与 WAITFOR 语句关联的线程后启动。如果服务器忙碌,则可能不会立即计划线程;因此,时间延迟可能比指定的时间要长。

WAITFOR 语句由下列子句之一指定:

  • DELAY 关键字后为 time_to_pass,是指完成 WAITFOR 语句之前等待的时间。完成 WAITFOR 语句之前等待的时间最多为 24 小时。

    在下面的示例中,执行 SELECT 语句之前使用 DELAY 关键字等待两秒钟:

    WAITFOR DELAY '00:00:02';
    SELECT BusinessEntityID FROM AdventureWorks2008R2.HumanResources.Employee;
    
  • TIME 关键字后为 time_to_execute,指定 WAITFOR 语句完成所用的时间。

    下面的示例使用 TIME 关键字等到晚上 10 点 (22:00) 才执行 AdventureWorks 数据库检查,从而确保正确地分配并使用所有页:

    USE AdventureWorks2008R2;
    GO
    BEGIN
        WAITFOR TIME '22:00';
        DBCC CHECKALLOC;
    END;
    GO
    
  • RECEIVE 语句子句,从 Service Broker 队列检索一条或多条消息。使用 RECEIVE 语句指定 WAITFOR 时,如果当前未显示任何消息,该语句将等待消息到达队列。

  • 后面带有 timeout 的 TIMEOUT 关键字将指定 Service Broker 等待消息到达队列的时间(毫秒)。可以在 RECEIVE 语句或 GET CONVERSATION GROUP 语句中指定 TIMEOUT。