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