Existe-t-il un moyen d'écrire une commande T-SQL pour la faire simplement dormir pendant une période de temps? J'écris un service Web de manière asynchrone et je veux pouvoir exécuter des tests pour voir si le modèle asynchrone va vraiment le rendre plus évolutif. Afin de "se moquer" d'un service externe qui est lent, je veux pouvoir appeler un serveur SQL avec un script qui s'exécute lentement, mais ne traite pas réellement une tonne de choses.
364
Réponses:
Regardez la commande WAITFOR .
Par exemple
Cette commande vous permet un haut degré de précision mais n'est précise que dans un délai de 10 à 16 ms sur une machine typique car elle repose sur GetTickCount . Ainsi, par exemple, l'appel
WAITFOR DELAY '00:00:00:001'
n'entraînera probablement aucune attente.la source
CREATE FUNCTION [dbo].[ForcedTimeout](@seconds int) returns int as BEGIN DECLARE @endTime datetime2(0) = DATEADD(SECOND, @seconds, GETDATE()); WHILE (GETDATE() < @endTime ) BEGIN SET @endTime = @endTime; -- do nothing, but SQL requires a statement. END
Je crois que le temps maximum que cela peut attendre est de 23 heures, 59 minutes et 59 secondes.
Voici une fonction à valeur scalaire pour montrer son utilisation; la fonction ci-dessous prendra un paramètre entier de secondes, qu'elle traduira ensuite en HH: MM: SS et l'exécutera en utilisant la
EXEC sp_executesql @sqlcode
commande pour interroger. La fonction ci-dessous est uniquement à des fins de démonstration, je sais qu'elle ne convient pas vraiment à une fonction à valeur scalaire! :-)SI vous souhaitez retarder plus de 24 heures, je vous suggère d'utiliser un paramètre @Days pour aller pendant un certain nombre de jours et envelopper l'exécutable de la fonction dans une boucle ... par exemple.
la source
Only functions and some extended stored procedures can be executed from within a function.
MS Docs fournit un exemple d'utilisation de processus stockés - il semble que cette approche ne soit pas valideVous pouvez également "ATTENDRE" un "TEMPS":
la source
PRINT
place deRAISERROR
?Voici un morceau de code C # très simple pour tester le CommandTimeout avec. Il crée une nouvelle commande qui attendra 2 secondes. Définissez CommandTimeout sur 1 seconde et vous verrez une exception lors de son exécution. La définition de CommandTimeout sur 0 ou quelque chose de supérieur à 2 s'exécute correctement. Soit dit en passant, le CommandTimeout par défaut est de 30 secondes.
la source