Есть ли способ написать команду T-SQL, чтобы просто спать в течение определенного периода времени? Я пишу веб-службу асинхронно, и я хочу, чтобы иметь возможность запускать некоторые тесты, чтобы увидеть, действительно ли асинхронный шаблон сделает его более масштабируемым. Чтобы "высмеять" внешнюю службу, которая работает медленно, я хочу иметь возможность вызывать SQL-сервер с script, который работает медленно, но на самом деле не обрабатывает тонны материала.
Команда Sleep в T-SQL?
Ответ 1
просмотрите команду WAITFOR
Eg.
-- wait for 1 minute
WAITFOR DELAY '00:01'
-- wait for 1 second
WAITFOR DELAY '00:00:01'
Эта команда позволяет получить высокую степень точности, но только точная в пределах 10 мс - 16 мс на типичной машине, поскольку она полагается на GetTickCount. Так, например, вызов WAITFOR DELAY '00:00:00:001'
, скорее всего, не заставит себя ждать.
Ответ 2
WAITFOR DELAY 'HH:MM:SS'
Я считаю, что максимальное время ожидания - 23 часа, 59 минут и 59 секунд.
Здесь Scalar-значная функция, чтобы показать ее использование; нижняя функция примет целочисленный параметр секунд, который затем переводит в HH: MM: SS и выполняет его с помощью команды EXEC sp_executesql @sqlcode
для запроса. Ниже функция предназначена только для демонстрации, я знаю, что она не подходит для цели действительно как скалярнозначная функция!: -)
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
Если вы хотите отложить более 24 часов, я предлагаю вам использовать параметр @Days для перехода на несколько дней и обернуть исполняемую функцию внутри цикла... например.
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
Ответ 3
Вот очень простая часть кода С# для тестирования CommandTimeout. Он создает новую команду, которая будет ждать 2 секунды. Установите CommandTimeout на 1 секунду, и при запуске вы увидите исключение. Установка CommandTimeout на 0 или на что-то большее, чем на 2, будет работать нормально. Кстати, по умолчанию CommandTimeout составляет 30 секунд.
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();
}
}
}
}
}
Ответ 4
Вы также можете "WAITFOR" "ВРЕМЯ":
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