sql >> データベース >  >> RDS >> Sqlserver

SQL Serverにストアドプロシージャをn秒ごとに呼び出させることはできますか?

    タイマー を使用します およびアクティベーション 。外部プロセスはなく、クラスタリングまたはミラーリングフェイルオーバー後も機能し続け、別のマシンで復元した後も機能し続け、Expressでも機能します。

    -- create a table to store the results of some dummy procedure
    create table Activity (
        InvokeTime datetime not null default getdate()
        , data float not null);
    go  
    
    -- create a dummy procedure
    create procedure createSomeActivity
    as
    begin
        insert into Activity (data) values (rand());
    end
    go
    
    -- set up the queue for activation
    create queue Timers;
    create service Timers on queue Timers ([DEFAULT]);
    go
    
    -- the activated procedure
    create procedure ActivatedTimers
    as
    begin
    declare @mt sysname, @h uniqueidentifier;
    begin transaction;
        receive top (1)
            @mt = message_type_name
            , @h = conversation_handle
            from Timers;
    
        if @@rowcount = 0
        begin
            commit transaction;
            return;
        end
    
        if @mt in (N'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
            , N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
        begin
            end conversation @h;
        end
        else if @mt = N'http://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer'
        begin
            exec createSomeActivity;
            -- set a new timer after 2s
            begin conversation timer (@h) timeout = 2;
        end
    commit
    end
    go
    
    -- attach the activated procedure to the queue
    alter queue Timers with activation (
        status = on
        , max_queue_readers = 1
        , execute as owner
        , procedure_name = ActivatedTimers);
    go  
    
    
    -- seed a conversation to start activating every 2s
    declare @h uniqueidentifier;
    begin dialog conversation @h
        from service [Timers]
        to service N'Timers', N'current database'
        with encryption = off;
    begin conversation timer (@h) timeout = 1;
    
    -- wait 15 seconds
    waitfor delay '00:00:15';
    
    -- end the conversation, will stop activating
    end conversation @h;
    go
    
    -- check that the procedure executed
    select * from Activity;
    


    1. where_inでimplode関数を使用するCodeigniterクエリビルダー

    2. MySQLは列のデータ型をVARCHARからINTに変換します

    3. MySqlスペイン語文字データ

    4. SQLデータベーステーブルからテキストボックスにデータをロードする方法