Existe uma maneira de escrever um comando T-SQL para fazê-lo dormir por um período de tempo? Estou escrevendo um serviço da Web de forma assíncrona e quero poder executar alguns testes para verificar se o padrão assíncrono realmente o tornará mais escalável. Para "zombar" de um serviço externo lento, desejo poder chamar um servidor SQL com um script que seja executado lentamente, mas na verdade não esteja processando muitas coisas.
364
Respostas:
Veja o comando WAITFOR .
Por exemplo
Esse comando permite um alto grau de precisão, mas é preciso apenas entre 10 e 16 ms em uma máquina típica, pois depende do GetTickCount . Assim, por exemplo,
WAITFOR DELAY '00:00:00:001'
é provável que a chamada resulte em nenhuma espera.fonte
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
Acredito que o tempo máximo que isso pode esperar é de 23 horas, 59 minutos e 59 segundos.
Aqui está uma função com valor escalar para mostrar seu uso; a função abaixo terá um parâmetro inteiro de segundos, que depois é convertido em HH: MM: SS e o executa usando o
EXEC sp_executesql @sqlcode
comando para consultar. A função abaixo é apenas para demonstração, eu sei que ela não se encaixa realmente como uma função com valor escalar! :-)Se você deseja atrasar mais de 24 horas, sugiro que você use um parâmetro @Days para passar vários dias e agrupar a função executável dentro de um loop ... por exemplo.
fonte
Only functions and some extended stored procedures can be executed from within a function.
MS Docs fornece um exemplo usando os procedimentos armazenados - parece que essa abordagem é inválidaVocê também pode "WAITFOR" a "TIME":
fonte
PRINT
vez deRAISERROR
?Aqui está uma parte muito simples do código C # para testar o CommandTimeout. Ele cria um novo comando que aguarda 2 segundos. Defina o CommandTimeout como 1 segundo e você verá uma exceção ao executá-lo. Definir o CommandTimeout como 0 ou algo maior que 2 funcionará bem. A propósito, o CommandTimeout padrão é 30 segundos.
fonte