Czy istnieje sposób, aby napisać polecenie T-SQL, aby uśpić go na pewien czas? Piszę usługę internetową asynchronicznie i chcę móc uruchomić kilka testów, aby sprawdzić, czy wzorzec asynchroniczny naprawdę sprawi, że będzie bardziej skalowalny. Aby „wyśmiewać” wolną usługę zewnętrzną, chcę móc wywoływać serwer SQL za pomocą skryptu, który działa wolno, ale tak naprawdę nie przetwarza wielu rzeczy.
364
Odpowiedzi:
Spójrz na polecenie WAITFOR .
Na przykład
To polecenie pozwala na wysoki stopień precyzji, ale jest dokładne tylko w ciągu 10ms - 16ms na typowej maszynie, ponieważ opiera się na GetTickCount . Na przykład połączenie
WAITFOR DELAY '00:00:00:001'
prawdopodobnie nie spowoduje żadnego oczekiwania.źródło
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
Uważam, że maksymalny czas, na który może czekać to 23 godziny, 59 minut i 59 sekund.
Oto funkcja o wartości skalarnej pokazująca, że jest używana; poniższa funkcja pobiera parametr liczby całkowitej w sekundach, który następnie tłumaczy na GG: MM: SS i wykonuje go za pomocą
EXEC sp_executesql @sqlcode
polecenia zapytania. Poniższa funkcja służy wyłącznie do celów demonstracyjnych, wiem, że nie nadaje się ona tak naprawdę do funkcji o wartości skalarnej! :-)JEŚLI chcesz opóźnić dłużej niż 24 godziny, sugeruję użycie parametru @Days, aby przejść przez kilka dni i zawinąć funkcję wykonywalną w pętli ... np.
źródło
Only functions and some extended stored procedures can be executed from within a function.
MS Docs podaje przykład przy użyciu Stored Procs - wygląda na to, że to podejście jest nieprawidłoweMożesz także „OCZEKIWAĆ” na „CZAS”:
źródło
PRINT
zamiastRAISERROR
?Oto bardzo prosty fragment kodu C # do przetestowania CommandTimeout. Tworzy nowe polecenie, które będzie czekać 2 sekundy. Ustaw CommandTimeout na 1 sekundę, a zobaczysz wyjątek podczas jego uruchamiania. Ustawienie CommandTimeout na wartość 0 lub wartość wyższą niż 2 będzie działać poprawnie. Nawiasem mówiąc, domyślny CommandTimeout to 30 sekund.
źródło