Я хочу иметь сохраненный proc, который вызывается каждые n секунд, есть ли способ сделать это в SQL Server, не зависимо от отдельного процесса?
Могу ли я заставить SQL Server вызывать хранимый процесс каждые n секунд?
Ответ 1
Используйте таймер и активация. Нет внешнего процесса, продолжает работать после отката кластеризации или зеркалирования, продолжает работать даже после восстановления на другой машине, и он также работает и с 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;
Ответ 2
Вы можете настроить работу агента SQL - это, вероятно, единственный способ.
Агент SQL Server является компонентом SQL Server, однако недоступен в Express-версиях, что позволяет автоматизировать определенные задачи, например обслуживание базы данных и т.д., но вы также можете использовать его для вызова хранимых процедур каждые n секунд.
Ответ 3
Я однажды установил хранимую процедуру, которая выполнялась непрерывно, uisng цикл с WAITFOR в конце его.
- Условие WHILE зависело от значения, считанного из простой таблицы конфигурации. Если значение приняло значение 0, цикл будет завершен, и процедура завершится.
- Я положил ЗАДЕРЖКУ WAITFOR в конце, так что, сколько бы времени ни потребовалось для обработки заданной итерации, она будет ждать XX секунд, пока не запустит ее снова. (XX также был установлен и прочитан из таблицы конфигурации.)
- Если он должен работать с точными интервалами (например, 0, 15, 30 и 45 секунд в минуту), вы можете вычислить соответствующее значение времени WATIFOR TIME в конце цикла.
- Наконец, у меня была процедура, вызванная заданием агента SQL раз в минуту. Работа всегда будет "запущена", показывая, что процедура запущена. Если процедура была убита или разбита, работа запустит ее не более 1 минуты. Если процедура была отключена, процедура все равно запускается, но цикл WHILE, содержащий обработку, не вводится, создавая верхний нуль.
Мне не нравилось иметь его в моей базе данных, но оно отвечало требованиям бизнеса.
Ответ 4
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Ответ 5
Если вы хотите открыть окно запроса SSMS:
While 1=1
Begin
exec "Procedure name here" ;
waitfor delay '00:00:15';
End