T-SQL中的睡眠命令?

有没有办法写一个T-SQL命令,让它睡一段时间? 我正在asynchronous编写Web服务,我希望能够运行一些testing来查看asynchronous模式是否真的能够使其更具可伸缩性。 为了“模拟”一个很慢的外部服务,我希望能够用一个运行速度很慢的脚本调用一个SQL服务器,但实际上并没有处理大量的东西。

看看WAITFOR命令

例如。

-- wait for 1 minute WAITFOR DELAY '00:01' -- wait for 1 second WAITFOR DELAY '00:00:01' 

这个命令允许你高精度,但是在一台典型的机器上,它只能在10ms-16ms的范围内,因为它依赖于GetTickCount 。 所以,例如,呼叫WAITFOR DELAY '00:00:00:001'很可能不会导致等待。

 WAITFOR DELAY 'HH:MM:SS' 

我相信这个可以等待的最长时间是23小时59分59秒。

这是一个标量值函数来显示它的使用; 下面的函数将取秒数的整数参数,然后将其转换为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小时,我build议你使用@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 

这是一个非常简单的C#代码来testingCommandTimeout。 它会创build一个等待2秒钟的新命令。 将CommandTimeout设置为1秒,运行时会看到一个exception。 设置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(); } } } } } 

你也可以“等待”一个“时间”:

  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