WAITFOR DELAY 'HH:MM:SS'
Je crois que le temps maximum d'attente est de 23 heures, 59 minutes et 59 secondes.
Voici une fonction à valeur scalaire pour montrer son utilisation ; la fonction ci-dessous prend un paramètre entier de secondes, qu'elle traduit ensuite en HH:MM:SS et l'exécute à l'aide de la fonction EXEC sp_executesql @sqlcode
pour effectuer une requête. La fonction ci-dessous n'est qu'une démonstration, je sais qu'elle n'est pas vraiment adaptée à une fonction à valeur scalaire ! :-)
CREATE FUNCTION [dbo].[ufn_DelayFor_MaxTimeIs24Hours]
(
@sec int
)
RETURNS
nvarchar(4)
AS
BEGIN
declare @hours int = @sec / 60 / 60
declare @mins int = (@sec / 60) - (@hours * 60)
declare @secs int = (@sec - ((@hours * 60) * 60)) - (@mins * 60)
IF @hours > 23
BEGIN
select @hours = 23
select @mins = 59
select @secs = 59
-- 'maximum wait time is 23 hours, 59 minutes and 59 seconds.'
END
declare @sql nvarchar(24) = 'WAITFOR DELAY '+char(39)+cast(@hours as nvarchar(2))+':'+CAST(@mins as nvarchar(2))+':'+CAST(@secs as nvarchar(2))+char(39)
exec sp_executesql @sql
return ''
END
SI vous souhaitez retarder plus de 24 heures, je vous suggère d'utiliser un paramètre @Days pour aller jusqu'à un certain nombre de jours et d'envelopper l'exécutable de la fonction dans une boucle... par exemple.
Declare @Days int = 5
Declare @CurrentDay int = 1
WHILE @CurrentDay <= @Days
BEGIN
--24 hours, function will run for 23 hours, 59 minutes, 59 seconds per run.
[ufn_DelayFor_MaxTimeIs24Hours] 86400
SELECT @CurrentDay = @CurrentDay + 1
END
22 votes
Bonne question ! Je pourrais avoir envie de l'utiliser un jour. En passant, c'est la première fois que j'entends parler de vouloir que la BD soit plus lente ;)
3 votes
L'appel d'un service asynchrone à partir de T-SQL me laisse perplexe.