[sql-server] T-SQL의 수면 명령?


1 Answers

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
Question

T-SQL 명령을 작성하여 일정 시간 동안 잠자기 상태로 만들 수 있습니까? 비동기 적으로 웹 서비스를 작성 중이며 비동기 패턴이 실제로 확장 성을 높이는 지 확인하기 위해 일부 테스트를 실행할 수 있기를 원합니다. 느린 외부 서비스를 "조롱 (mock)"하기 위해 천천히 실행되는 스크립트로 SQL 서버를 호출 할 수 있기를 원하지만 실제로는 엄청난 양의 데이터를 처리하지는 않습니다.




다음은 CommandTimeout을 테스트하는 C # 코드의 아주 간단한 부분입니다. 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();
        }
      }
    }
  }
}





Related