Commande de sumil dans T-SQL?

Est-il possible d'écrire une command T-SQL pour la faire dormir pendant un certain time? J'écris un service Web de manière asynchronous et je veux être en mesure d'exécuter des tests pour voir si le model asynchronous va vraiment le rendre plus évolutif. Afin de "se moquer" d'un service externe qui est lent, je veux pouvoir appeler un server SQL avec un script qui tourne lentement, mais qui ne traite pas beaucoup de choses.

regardez la command WAITFOR

Par exemple.

-- wait for 1 minute WAITFOR DELAY '00:01' -- wait for 1 second WAITFOR DELAY '00:00:01' 

Cette command vous permet d'get un degré de précision élevé, mais n'est précise que dans les 10 ms à 16 ms sur une machine standard car elle dépend de GetTickCount . Ainsi, par exemple, l'appel WAITFOR DELAY '00:00:00:001' risque de ne pas entraîner d'attente du tout.

 WAITFOR DELAY 'HH:MM:SS' 

Je crois que le time maximum que cela peut attendre est de 23 heures, 59 minutes et 59 secondes.

Voici une fonction scalaire pour montrer son utilisation; La fonction ci-dessous prendra un paramètre entier de secondes, qu'elle traduit ensuite en HH: MM: SS et l'exécute en utilisant la command EXEC sp_executesql @sqlcode pour interroger. La fonction ci-dessous est à titre de démonstration seulement, je sais que ce n'est pas vraiment utile pour une fonction 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 pendant un certain nombre de jours et envelopper la fonction exécutable 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 

Voici un morceau très simple de code C # pour tester le CommandTimeout avec. Il crée une nouvelle command qui attendra 2 secondes. Définissez le CommandTimeout à 1 seconde et vous verrez une exception lors de son exécution. Définir le CommandTimeout sur 0 ou quelque chose de plus élevé que 2 fonctionnera correctement. À propos, le CommandTimeout par défaut est 30 secondes.

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; namespace ConsoleApplication1 { class Program { static void Main(ssortingng[] args) { var builder = new SqlConnectionSsortingngBuilder(); builder.DataSource = "localhost"; builder.IntegratedSecurity = true; builder.InitialCatalog = "master"; var connectionSsortingng = builder.ConnectionSsortingng; using (var connection = new SqlConnection(connectionSsortingng)) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "WAITFOR DELAY '00:00:02'"; command.CommandTimeout = 1; command.ExecuteNonQuery(); } } } } } 

Vous pouvez également "WAITFOR" un "TIME":

  RAISERROR('Im about to wait for a certain time...', 0, 1) WITH NOWAIT WAITFOR TIME '16:43:30.000' RAISERROR('I waited!', 0, 1) WITH NOWAIT