Sử dụng hẹn giờ và kích hoạt . Không có quy trình bên ngoài nào, tiếp tục hoạt động sau khi chuyển đổi dự phòng phân cụm hoặc phản chiếu, tiếp tục hoạt động ngay cả sau khi khôi phục trên một máy khác và nó cũng hoạt động trê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;