T-SQL中的睡眠命令?

时间:2009-03-20 03:39:52

标签: sql-server tsql asynchronous sleep

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

4 个答案:

答案 0 :(得分:571)

查看WAITFOR命令

EG。

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

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

此命令允许您高度精确,但在典型计算机上only accurate within 10ms - 16ms依赖于GetTickCount。因此,例如,调用WAITFOR DELAY '00:00:00:001'很可能导致无法等待。

答案 1 :(得分:8)

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

答案 2 :(得分:4)

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

    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

答案 3 :(得分:0)

这是一个非常简单的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();
        }
      }
    }
  }
}