টি-এসকিউএল এ স্লিপ কমান্ড?


364

কোনও সময়ের জন্য ঘুমিয়ে যাওয়ার জন্য কোনও টি-এসকিউএল কমান্ড লেখার উপায় নেই? আমি একটি ওয়েব পরিষেবা অবিচ্ছিন্নভাবে লিখছি এবং অ্যাসিঙ্ক্রোনাস প্যাটার্নটি সত্যই এটি আরও পরিমাপযোগ্য করতে যাচ্ছে কিনা তা দেখার জন্য আমি কয়েকটি পরীক্ষা চালাতে সক্ষম হতে চাই। বাহ্যিক পরিষেবাটি ধীরে ধীরে "উপহাস" করার জন্য, আমি একটি এসকিউএল সার্ভারকে ধীরে ধীরে চালিত স্ক্রিপ্টের সাথে কল করতে সক্ষম হতে চাই, তবে আসলে এক টন স্টাফ প্রক্রিয়া করছি না।


19
ফর্সা প্রশ্ন! আমি এটি কখনও কখনও ব্যবহার করতে চাই। পুরোপুরি একপাশে, আমি এই প্রথম প্রথমবারের মতো
ডিবিকে

2
আমি টি এসকিউএল থেকে একটি অ্যাসিঙ্ক্রোনাস পরিষেবা কল করে বিচলিত।
jmucchiello

উত্তর:


616

WAITFOR কমান্ড।

যেমন

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

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

এই কমান্ডটি আপনাকে উচ্চতর ডিগ্রি নির্ভুলতার অনুমতি দেয় তবে এটি একটি গতিশীল মেশিনে 10 মেসে - 16 মিমি অবধি সঠিক কারণ এটি গেটটিকাউন্টে নির্ভর করে । সুতরাং, উদাহরণস্বরূপ, কলটির WAITFOR DELAY '00:00:00:001'ফলস্বরূপ কোনও অপেক্ষার অবকাশ নেই।


4
এটি কোনও ফাংশন থেকে কীভাবে কাজ করবেন তা জানেন? আমি (সঠিকভাবে সম্ভবত), কিন্তু পরীক্ষার ই) WAITFOR 'একটি ফাংশন মধ্যে' একটি পার্শ্ব-effecting অপারেটর ব্যবহারের অবৈধ 'ওভাররাইড করতে চাই অনুরোধে .... জন্য
monojohnny

2
@ মোমোজোহ্নি অপেক্ষা করার জন্য একটি এসভিএফ পেতে, আমি জোশের উত্তর নীচে চেষ্টা করেছি তবে এটি কার্যকর হয়নি। পরিবর্তে আমি কেবল এই জাতীয় একটি লুপ তৈরি করেছি:CREATE FUNCTION [dbo].[ForcedTimeout](@seconds int) returns int as BEGIN DECLARE @endTime datetime2(0) = DATEADD(SECOND, @seconds, GETDATE()); WHILE (GETDATE() < @endTime ) BEGIN SET @endTime = @endTime; -- do nothing, but SQL requires a statement. END
গাইলসডমিল্ডন

3
আপনি এমএসের জন্য 3 টি সংখ্যা ব্যবহার করেছেন তা নিশ্চিত করুন - '00: 00: 00: 01 'দ্বিতীয়টি '00: 00: 00: 010' এর সমান নয়। (এমএসএসকিউএল 2016 এ পরীক্ষা করা হয়েছে)
নিক

আপনি যদি কোনও টেবিলটি ব্লক করতে হয় তবে আপনি শুরু করুন ট্রান্সএশন এবং শেষ ট্রান্সএশনও চেষ্টা করে দেখতে পারেন
রিচার্ড বালদৌফ

9
WAITFOR DELAY 'HH:MM:SS'

আমি বিশ্বাস করি যে এটি সর্বাধিক সময় অপেক্ষা করতে পারে তা হল 23 ঘন্টা, 59 মিনিট এবং 59 সেকেন্ড।

এটির ব্যবহারটি দেখানোর জন্য এখানে একটি স্কেলারের মূল্যবান ফাংশন রয়েছে; নীচের ফাংশনটি সেকেন্ডের একটি পূর্ণসংখ্যা প্যারামিটার গ্রহণ করবে, এটি এটি এইচএইচ: এমএম: এসএস এ অনুবাদ করে এবং 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

যদি আপনি ২৪ ঘণ্টার বেশি দেরি করতে চান তবে আমি আপনাকে @ ডাইস প্যারামিটারটি বেশ কয়েক দিন ব্যবহার করতে এবং ফাংশনটিকে একটি লুপের মধ্যে মোড়ক দেওয়ার জন্য পরামর্শ দিচ্ছি ... যেমন।

    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

এসকিউএল Only functions and some extended stored procedures can be executed from within a function. অ্যাজুর পছন্দ করেন না এই এমএস ডক্সটি স্টোরড প্রোকস ব্যবহার করে একটি উদাহরণ সরবরাহ করে - দেখে মনে হচ্ছে এই পদ্ধতিটি অবৈধ
স্লিভারনিজা - এমএসএফটি

5

আপনি একটি "সময়" "ওয়েটফোর" করতে পারেন:

    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

2
PRINTপরিবর্তে ব্যবহার করবেন না কেন RAISERROR?
slartidan

4
কারণ অন্যথায় আপনি সম্পূর্ণ অপেক্ষা শেষ না হওয়া পর্যন্ত কিছুই দেখতে পাবেন না। RAISERROR আপনাকে NOWAIT বিকল্প দেয়, সুতরাং এটি আপনাকে রিয়েল স্টেটমেন্টগুলিতে (মূলত) মুদ্রণ প্রদর্শন করবে, যখন বাফার পূর্ণ হয় বা ব্যাচটি সম্পূর্ণ হওয়ার পরে তার বিপরীতে।
জেরেমি গিয়াকো

0

কমান্ডটাইমআউটটি পরীক্ষা করার জন্য এখানে সি # কোডের একটি খুব সাধারণ টুকরো। এটি একটি নতুন কমান্ড তৈরি করে যা 2 সেকেন্ড অপেক্ষা করবে। কমান্ডটাইমআউটটি 1 সেকেন্ডে সেট করুন এবং এটি চালানোর সময় আপনি একটি ব্যতিক্রম দেখতে পাবেন। কমান্ডটাইমআউটকে 0 বা 2 এর চেয়ে বেশি কিছুতে সেট করা ঠিকঠাক হবে। যাইহোক, ডিফল্ট কমান্ডটাইমআউটটি 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();
        }
      }
    }
  }
}

2
আপনি যদি সি # তে থাকেন তবে আপনার সম্ভবত থ্রেড কোডারেন্টট্রেড.স্লিপ (60000) বা থ্রেড.স্লিপ (60000) ব্যবহার করা উচিত যা একই জিনিসটি করে। এইভাবে আপনার বিলম্বটি আপনার আবেদনের সাথে বিচ্ছিন্ন। তারপরে আপনার পরবর্তী ডাটাবেস যুক্তিকে কল করুন।
অ্যাকশন ড্যান

2
থ্রেড ব্যবহার করে অ্যাকশনডান.স্লাইপ যদিও কমান্ডটাইমআউটটি অনুশীলন করতে সহায়তা করবে না তা ঠিক। স্বীকৃত উদাহরণ হিসাবে, এটি বাক্সে যা লেখা আছে তা করে।
রিচার্ড হাউয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.