sql-server - 我可以让 SQL Server 每 n 秒调用一个存储过程吗?

标签 sql-server

我希望有一个每 n 秒调用一次的存储过程,有没有办法在 SQL Server 中执行此操作而不依赖于单独的进程?

最佳答案

使用 timeractivation 。没有外部进程,在集群或镜像故障转移后继续工作,即使在不同计算机上恢复后也继续工作,并且它也适用于 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;

关于sql-server - 我可以让 SQL Server 每 n 秒调用一个存储过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4079363/

相关文章:

sql-server - 如何使用 sequelize 定义 NVARCHAR(MAX) 字段?

sql - 如何通过 SQL Server 上的数据库名称获取所有数据库的索引名称

sql-server - SQL Server 批量插入 : why "The FIRSTROW attribute is not intended to skip column headers"?

sql-server - 我应该将哪个连接字符串与 MS SQL 中的应用程序角色一起使用?

c# - 将执行的 Sql 保存在表中

sql-server - 在 sql 脚本中使用系统环境变量

sql - TSQL BINARY_CHECKSUM 作为默认值

sql-server - 如何获得两个日期之间的天/月/年(datediff)差异?

sql-server - 如何使用带有 T-SQL 和 OLE 自动化过程的 HTTP POST 发送参数

sql - 围绕单个语句的事务有什么作用?