Есть ли способ написать команду T-SQL, чтобы просто заставить его спать в течение определенного периода времени? Я пишу веб-сервис асинхронно и хочу иметь возможность запускать некоторые тесты, чтобы увидеть, действительно ли асинхронный шаблон сделает его более масштабируемым. Чтобы «насмехаться» над внешней медленной службой, я хочу иметь возможность вызывать SQL-сервер со скриптом, который работает медленно, но на самом деле не обрабатывает тонны вещей.
364
Ответы:
Посмотрите на команду WAITFOR .
Например
Эта команда обеспечивает высокую степень точности, но она точна только в течение 10 мс - 16 мс на типичной машине, так как она зависит от GetTickCount . Так, например, вызов
WAITFOR DELAY '00:00:00:001'
, скорее всего, вообще не будет ждать.источник
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
Я считаю, что максимальное время ожидания составляет 23 часа 59 минут 59 секунд.
Вот скалярная функция, чтобы показать ее использование; нижеприведенная функция примет целочисленный параметр в секундах, который затем преобразуется в ЧЧ: ММ: СС и выполняет его, используя
EXEC sp_executesql @sqlcode
команду для запроса. Приведенная ниже функция предназначена только для демонстрации, я знаю, что она не подходит для этой цели в качестве скалярной функции! :-)Если вы хотите отложить более 24 часов, я предлагаю вам использовать параметр @Days, чтобы перейти на несколько дней и обернуть исполняемый файл функции в цикл ... например.
источник
Only functions and some extended stored procedures can be executed from within a function.
MS Docs предоставляет пример с использованием Stored Procs - похоже, этот подход недопустимВы также можете «ОЖИДАТЬ» «ВРЕМЯ»:
источник
PRINT
вместоRAISERROR
?Вот очень простой фрагмент кода на C # для тестирования CommandTimeout. Создается новая команда, которая будет ждать 2 секунды. Установите CommandTimeout на 1 секунду, и вы увидите исключение при его запуске. Установка CommandTimeout в 0 или что-то выше 2 будет работать нормально. Кстати, по умолчанию CommandTimeout составляет 30 секунд.
источник