Usar WAITFOR

La instrucción WAITFOR suspende la ejecución de un lote, un procedimiento almacenado o una transacción hasta que:

  • Haya pasado un intervalo de tiempo especificado.

  • Se haya alcanzado una hora del día especificada.

  • Una instrucción RECEIVE especificada modifique o devuelva como mínimo una fila en una cola de Service Broker.

El retardo de tiempo real puede variar con respecto al tiempo especificado y depende del nivel de actividad del servidor. El contador de tiempo se inicia cuando se programa el subproceso asociado a la instrucción WAITFOR. Si el servidor está ocupado, el subproceso no se programará de forma inmediata; por lo tanto, el retardo de tiempo puede ser mayor que el tiempo especificado.

La instrucción WAITFOR se especifica con una de las siguientes cláusulas:

  • La palabra clave DELAY seguida de time_to_pass antes de que se complete la instrucción WAITFOR. El tiempo que puede pasar antes de la finalización de la instrucción WAITFOR puede ser de hasta 24 horas.

    En el siguiente ejemplo se usa la palabra clave DELAY para esperar dos segundos antes de realizar una instrucción SELECT:

    WAITFOR DELAY '00:00:02';
    SELECT EmployeeID FROM AdventureWorks.HumanResources.Employee;
    
  • La palabra clave TIME seguida de time_to_execute, que especifica la hora en que se completa la instrucción WAITFOR.

    En el siguiente ejemplo se usa la palabra clave TIME para esperar hasta las 10 p.m. (22:00) para realizar una comprobación de la base de datos AdventureWorks con el fin de asegurar que todas las páginas están asignadas y se usan correctamente:

    USE AdventureWorks;
    GO
    BEGIN
        WAITFOR TIME '22:00';
        DBCC CHECKALLOC;
    END;
    GO
    
  • Una cláusula de instrucción RECEIVE que recupera uno o varios mensajes de una cola de Service Broker. Cuando WAITFOR se especifica con una instrucción RECEIVE, la instrucción espera la llegada de un mensaje a la cola, si no hay ningún mensaje presente.

  • La palabra clave TIMEOUT seguida de timeout especifica la duración, en milisegundos, que Service Broker espera a que un mensaje llegue a la cola. TIMEOUT puede especificarse en la instrucción RECEIVE o en la instrucción GET CONVERSATION GROUP.