Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de données SQL dans Microsoft Fabric
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
Syntax
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Arguments
DELAY
Période spécifiée qui doit passer, jusqu’à un maximum de 24 heures, avant l’exécution d’un lot, d’une procédure stockée ou d’une transaction.
'time_to_pass'
Période d’attente.
time_to_pass peuvent être spécifiés dans un format de données datetime ou en tant que variable locale. Les dates ne peuvent pas être spécifiées. Par conséquent, la partie date de la valeur datetime n’est pas autorisée.
time_to_pass est mis en forme en tant que hh:mm[[:ss].fff].
TIME
Heure spécifiée lors de l’exécution du lot, de la procédure stockée ou de la transaction.
'time_to_execute'
Heure à laquelle l’instruction WAITFOR se termine.
time_to_execute pouvez être spécifié dans un format de données datetime , ou il peut être spécifié en tant que variable locale. Les dates ne peuvent pas être spécifiées. Par conséquent, la partie date de la valeur datetime n’est pas autorisée.
time_to_execute est mis en forme comme hh:mm[[:ss].fff] et peut éventuellement inclure la date de 1900-01-01.
receive_statement
S’applique uniquement aux messages Service Broker. Pour plus d’informations, consultez RECEIVE.
Instruction valide RECEIVE .
get_conversation_group_statement
S’applique uniquement aux messages Service Broker. Pour plus d’informations, consultez GET CONVERSATION GROUP.
Instruction valide GET CONVERSATION GROUP .
TEMPS MORT
S’applique uniquement aux messages Service Broker. Pour plus d’informations, consultez RECEIVE et GET CONVERSATION GROUP.
Spécifie la période de temps, en millisecondes, pendant laquelle un message peut rejoindre la file d'attente.
Remarks
Pendant l’exécution de l’instruction WAITFOR , la transaction est en cours d’exécution et aucune autre requête ne peut s’exécuter sous la même transaction.
Le délai réel peut varier de l’heure spécifiée dans time_to_pass, time_to_execute ou délai d’expiration, et dépend du niveau d’activité du serveur. Le compteur de temps démarre lorsque le WAITFOR thread d’instruction est planifié. Si le serveur est occupé, le thread peut ne pas être planifié immédiatement, de sorte que le délai de temps peut être plus long que l’heure spécifiée.
WAITFOR ne modifie pas la sémantique d’une requête. Si une requête ne peut retourner aucune ligne, WAITFOR attend toujours ou jusqu’à ce qu’elle TIMEOUT soit atteinte, si elle est spécifiée.
Les curseurs ne peuvent pas être ouverts sur WAITFOR les instructions.
Les vues ne peuvent pas être définies sur WAITFOR les instructions.
Lorsque la requête dépasse l’option d’attente de requête, l’argument WAITFOR d’instruction peut se terminer sans exécuter. Pour plus d’informations sur l’option de configuration, consultez Configuration du serveur : attente de requête. Pour afficher les processus actifs et en attente, utilisez sp_who.
Chaque WAITFOR instruction a un thread associé à celui-ci. Si de nombreuses instructions sont spécifiées sur le même serveur, de nombreux WAITFOR threads peuvent être liés en attente de l’exécution de ces instructions. SQL Server surveille le nombre de threads d’instruction WAITFOR et sélectionne aléatoirement certains de ces threads pour quitter si le serveur commence à rencontrer une insuffisance de thread.
Vous pouvez créer un interblocage en exécutant une requête avec WAITFOR une transaction contenant également des verrous empêchant les modifications apportées à 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.
Caution
L’inclusion WAITFOR ralentit l’achèvement du processus SQL Server et peut entraîner un message de délai d’expiration 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.
Examples
A. Utiliser WAITFOR TIME
L’exemple suivant exécute la procédure sp_update_job stockée dans la msdb base de données à 10: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. Utiliser 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. Utiliser 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.
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.