waiting waitfor query example sql-server tsql asynchronous sleep

sql-server - query - waitfor sql example



Comando Sleep en T-SQL? (4)

Aquí hay una pieza muy simple de código C # para probar con CommandTimeout. Crea un nuevo comando que esperará 2 segundos. Establezca CommandTimeout en 1 segundo y verá una excepción cuando lo ejecute. La configuración de CommandTimeout en 0 o en algo superior a 2 funcionará bien. Por cierto, el CommandTimeout predeterminado es de 30 segundos.

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(string[] args) { var builder = new SqlConnectionStringBuilder(); builder.DataSource = "localhost"; builder.IntegratedSecurity = true; builder.InitialCatalog = "master"; var connectionString = builder.ConnectionString; using (var connection = new SqlConnection(connectionString)) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "WAITFOR DELAY ''00:00:02''"; command.CommandTimeout = 1; command.ExecuteNonQuery(); } } } } }

¿Hay alguna forma de escribir un comando T-SQL para que se duerma durante un período de tiempo? Estoy escribiendo un servicio web de forma asíncrona y quiero poder realizar algunas pruebas para ver si el patrón asíncrono realmente lo hará más escalable. Para "simular" un servicio externo que es lento, quiero poder llamar a un servidor SQL con un script que se ejecuta lentamente, pero en realidad no está procesando un montón de cosas.


También puede "WAITFOR" a "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


mira el comando WAITFOR

P.ej.

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

Este comando le permite un alto grado de precisión, pero solo es preciso dentro de 10 ms - 16 ms en una máquina típica, ya que se basa en GetTickCount . Entonces, por ejemplo, es probable que la llamada WAITFOR DELAY ''00:00:00:001'' resulte en no esperar nada.


WAITFOR DELAY ''HH:MM:SS''

Creo que el tiempo máximo que puede esperar es de 23 horas, 59 minutos y 59 segundos.

Aquí hay una función de valor escalar para mostrar su uso; la siguiente función tomará un parámetro entero de segundos, que luego se traducirá en HH: MM: SS y lo ejecutará usando el comando EXEC sp_executesql @sqlcode para consultar. ¡La siguiente función es solo para demostración, sé que no es apta para un propósito realmente como una función de valor escalar! :-)

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 desea demorar más de 24 horas, le sugiero que use un parámetro @Days para pasar varios días y ajustar la función ejecutable dentro de un bucle ... por ejemplo.

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