Partager via


WAITFOR (Transact-SQL)

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 spécifié soit atteint ou qu'une instruction spécifiée modifie ou retourne au moins une ligne.

Icône Lien de rubrique Conventions de la syntaxe de Transact-SQL

Syntaxe

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

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 tout format accepté pour les données datetime ou comme une 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
    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 tout format accepté pour les données datetime ou comme une 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.

  • receive_statement
    Instruction RECEIVE valide.

    Important

    Vous pouvez appliquer WAITFOR avec receive_statement uniquement aux messages Service Broker. Pour plus d'informations, consultez RECEIVE (Transact-SQL).

  • get_conversation_group_statement
    Instruction GET CONVERSATION GROUP valide.

    Important

    Vous pouvez appliquer WAITFOR avec get_conversation_group_statement 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 volume d'activité du serveur. Le compteur démarre lorsque le thread associé à 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 surveille le nombre de threads associés aux 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 des verrous empêchant la modification de l'ensemble de lignes auquel l'instruction WAITFOR essaie d'accéder. SQL Server identifie ces scénarios et retourne un jeu de résultats vide si le risque d'un tel blocage existe.

AttentionAttention

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

A.Utilisation de WAITFOR TIME

L'exemple suivant exécute la procédure stockée sp_update_job à 22 h 20. (22:20).

USE msdb;
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. Une procédure stockée est créée, qui reste en attente pendant un certain temps puis retourne à l'utilisateur les informations relatives au nombre d'heures, de minutes et de secondes qui se sont écoulées.

USE AdventureWorks2012;
GO
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 l'ensemble des résultats.

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

Voir aussi

Référence

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

datetime (Transact-SQL)

sp_who (Transact-SQL)