WAITFOR (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Bloque l’exécution d’un lot, d’une procédure stockée ou d’une transaction jusqu’à ce que l’heure ou l’intervalle de temps indiqué soit atteint ou qu’une instruction spécifiée modifie ou retourne au moins une ligne.

Conventions de la syntaxe Transact-SQL

Syntaxe

  
WAITFOR   
{  
    DELAY 'time_to_pass'   
  | TIME 'time_to_execute'   
  | [ ( receive_statement ) | ( get_conversation_group_statement ) ]   
    [ , TIMEOUT timeout ]  
}  

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

DELAY
Période de temps qui doit s'écouler, dans la limite de 24 heures, avant la poursuite de l'exécution d'un traitement d'instructions, d'une procédure stockée ou d'une transaction.

'time_to_pass'
Durée de l'attente. time_to_pass peut être spécifié dans un format de données datetime ou en tant que variable locale. Vous ne pouvez pas spécifier de dates ; par conséquent, la partie date de la valeur datetime n’est pas autorisée. time_to_pass est au format hh:mm[[:ss].mss].

TEMPS
Heure spécifiée de l'exécution du traitement d'instructions, de la procédure stockée ou de la transaction.

'time_to_execute'
Heure à laquelle se termine l'instruction WAITFOR. time_to_execute peut être spécifié dans un format de données datetime ou en tant que variable locale. Vous ne pouvez pas spécifier de dates ; par conséquent, la partie date de la valeur datetime n’est pas autorisée. time_to_execute est au format hh:mm[[:ss].mss] et peut facultativement inclure la date au format 1900-01-01.

receive_statement
Instruction RECEIVE valide.

Important

WAITFOR avec receive_statement s’applique uniquement aux messages Service Broker. Pour plus d’informations, consultez RECEIVE (Transact-SQL).

get_conversation_group_statement
Instruction GET CONVERSATION GROUP valide.

Important

WAITFOR avec get_conversation_group_statement s’applique uniquement aux messages Service Broker. Pour plus d’informations, consultez GET CONVERSATION GROUP (Transact-SQL).

TIMEOUT timeout
Spécifie la période de temps, en millisecondes, pendant laquelle un message peut rejoindre la file d'attente.

Important

Vous pouvez appliquer WAITFOR avec TIMEOUT uniquement aux messages Service Broker. Pour plus d’informations, consultez RECEIVE (Transact-SQL) et GET CONVERSATION GROUP (Transact-SQL).

Notes

Pendant l'exécution de l'instruction WAITFOR, la transaction est exécutée et aucune autre demande ne peut s'exécuter sous cette même transaction.

Le délai réel peut être différent du délai spécifié dans time_to_pass, time_to_execute ou timeout, et il dépend du niveau d’activité du serveur. Le compteur démarre quand le thread de l’instruction WAITFOR est planifié. Si le serveur est occupé, il est possible que le thread ne soit pas immédiatement planifié ; par conséquent, le délai peut être supérieur à la durée spécifiée.

WAITFOR ne modifie pas la sémantique d’une requête. Si une requête ne peut pas retourner de lignes, WAITFOR attend indéfiniment ou jusqu’à ce que la valeur TIMEOUT soit atteinte, si celle-ci est spécifiée.

Vous ne pouvez pas ouvrir de curseurs sur les instructions WAITFOR.

Vous ne pouvez pas définir de vues sur les instructions WAITFOR.

Lorsque la requête dépasse la limite définie par l'option query wait, l'argument de l'instruction WAITFOR peut prendre fin sans être exécuté. Pour plus d’informations sur l’option de configuration, consultez Configurer l’option de configuration du serveur query wait. Pour afficher les processus actifs et en attente, utilisez sp_who.

À chaque instruction WAITFOR est associé un thread. Si de nombreuses instructions WAITFOR sont spécifiées sur le même serveur, de nombreux threads peuvent être bloqués dans l'attente de l'exécution de ces instructions. SQL Server supervise le nombre de threads d’instructions WAITFOR et en sélectionne certains aléatoirement afin de les libérer si le serveur commence à manquer de threads.

Vous pouvez créer un blocage en exécutant une requête avec WAITFOR dans une transaction qui détient aussi des verrous empêchant la modification de l’ensemble de lignes accessible par l’instruction WAITFOR. SQL Server identifie ces scénarios et retourne un jeu de résultats vide si le risque d'un tel blocage existe.

Attention

Inclure WAITFOR affiche la fin du processus SQL Server et peut générer un message de délai de connexion dépassé dans l'application. Si nécessaire, réglez le paramètre de délai de connexion dépassé pour la connexion au niveau de l'application.

Exemples

R. Utilisation de WAITFOR TIME

L'exemple suivant exécute la procédure stockée sp_update_job dans la base de données msdb à 22 h 20 (22:20).

EXECUTE sp_add_job @job_name = 'TestJob';  
BEGIN  
    WAITFOR TIME '22:20';  
    EXECUTE sp_update_job @job_name = 'TestJob',  
        @new_name = 'UpdatedJob';  
END;  
GO  

B. Utilisation de WAITFOR DELAY

L'exemple suivant exécute la procédure stockée après un délai de deux heures.

BEGIN  
    WAITFOR DELAY '02:00';  
    EXECUTE sp_helpdb;  
END;  
GO  

C. Utilisation de WAITFOR DELAY avec une variable locale

L'exemple suivant illustre l'utilisation d'une variable locale avec l'option WAITFOR DELAY. Cette procédure stockée reste en attente pendant un certain temps, puis retourne à l’utilisateur les informations comme le nombre d’heures, de minutes et de secondes qui se sont écoulées.

IF OBJECT_ID('dbo.TimeDelay_hh_mm_ss','P') IS NOT NULL  
    DROP PROCEDURE dbo.TimeDelay_hh_mm_ss;  
GO  
CREATE PROCEDURE dbo.TimeDelay_hh_mm_ss   
    (  
    @DelayLength char(8)= '00:00:00'  
    )  
AS  
DECLARE @ReturnInfo VARCHAR(255)  
IF ISDATE('2000-01-01 ' + @DelayLength + '.000') = 0  
    BEGIN  
        SELECT @ReturnInfo = 'Invalid time ' + @DelayLength   
        + ',hh:mm:ss, submitted.';  
        -- This PRINT statement is for testing, not use in production.  
        PRINT @ReturnInfo   
        RETURN(1)  
    END  
BEGIN  
    WAITFOR DELAY @DelayLength  
    SELECT @ReturnInfo = 'A total time of ' + @DelayLength + ',   
        hh:mm:ss, has elapsed! Your time is up.'  
    -- This PRINT statement is for testing, not use in production.  
    PRINT @ReturnInfo;  
END;  
GO  
/* This statement executes the dbo.TimeDelay_hh_mm_ss procedure. */  
EXEC TimeDelay_hh_mm_ss '00:00:10';  
GO  

Voici le jeu de résultats obtenu.

A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.

Voir aussi

Langage de contrôle de flux (Transact-SQL)
datetime (Transact-SQL)
sp_who (Transact-SQL)