有没有办法写一个T-SQL命令让它睡一段时间?我正在异步编写Web服务,我希望能够运行一些测试,看看异步模式是否真的会使它更具可伸缩性.为了"模拟"一个缓慢的外部服务,我希望能够使用运行缓慢的脚本调用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小时,我建议您使用@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