Команда сна в T-SQL?
есть ли способ написать команду T-SQL, чтобы просто заставить ее спать в течение определенного периода времени? Я пишу веб-службу асинхронно, и я хочу иметь возможность запускать некоторые тесты, чтобы увидеть, действительно ли асинхронный шаблон сделает его более масштабируемым. Чтобы" издеваться " над внешней службой, которая работает медленно, я хочу иметь возможность вызывать SQL server со скриптом, который работает медленно, но на самом деле не обрабатывает тонну материала.
4 ответа:
посмотреть ждать команда
например.
-- 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'
скорее всего, не будет ждать вообще.
WAITFOR DELAY 'HH:MM:SS'
Я считаю, что максимальное время это может подождать 23 часа, 59 минут и 59 секунд.
вот скалярная функция, чтобы показать ее использование; приведенная ниже функция будет принимать целочисленный параметр секунд, который затем преобразуется в HH:MM: SS и выполняет его с помощью запрос. Ниже функция предназначена только для демонстрации, я знаю,что она не подходит для целей действительно как скалярная функция! : -)
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
вы также можете "ждать" A "время":
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
вот очень простой кусок кода C# для тестирования 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(); } } } } }