¿Hay alguna manera de escribir un comando T-SQL para hacerlo dormir por un período de tiempo? Estoy escribiendo un servicio web de forma asincrónica y quiero poder ejecutar algunas pruebas para ver si el patrón asincrónico 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.
364
Respuestas:
Mira el comando WAITFOR .
P.ej
Este comando le permite un alto grado de precisión, pero solo es preciso entre 10 ms y 16 ms en una máquina típica, ya que se basa en GetTickCount . Entonces, por ejemplo,
WAITFOR DELAY '00:00:00:001'
es probable que la llamada no dé lugar a ninguna espera.fuente
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
Creo que el tiempo máximo que esto 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á a HH: MM: SS y lo ejecutará usando el
EXEC sp_executesql @sqlcode
comando para consultar. La siguiente función es solo para demostración, ¡sé que no es adecuada para el propósito realmente como una función de valor escalar! :-)SI desea retrasar más de 24 horas, le sugiero que use un parámetro @Days para pasar varios días y envolver la función ejecutable dentro de un bucle ... por ejemplo.
fuente
Only functions and some extended stored procedures can be executed from within a function.
MS Docs proporciona un ejemplo usando Procs almacenados ; parece que este enfoque no es válidoTambién puede "ESPERAR" un "TIEMPO":
fuente
PRINT
lugar deRAISERROR
?Aquí hay una pieza muy simple de código C # para probar CommandTimeout. Crea un nuevo comando que esperará 2 segundos. Establezca CommandTimeout en 1 segundo y verá una excepción cuando lo ejecute. Establecer CommandTimeout en 0 o en algo superior a 2 funcionará bien. Por cierto, el CommandTimeout predeterminado es de 30 segundos.
fuente