Deseo tener un proceso almacenado que se llame cada n segundos, ¿hay alguna manera de hacerlo en SQL Server sin depender de un proceso separado?¿Puedo hacer que SQL Server llame a un proceso almacenado cada n segundos?
Respuesta
Utilice un timer y activation. Ningún proceso externo, continúa funcionando después de una conmutación por error de agrupamiento o duplicación, continúa funcionando incluso después de una restauración en una máquina diferente, y también funciona en 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;
Puede configurar un trabajo de Agente de SQL: probablemente sea el único camino a seguir.
SQL Server Agent es un componente de SQL Server - no disponible en las ediciones Express, sin embargo - que le permite automatizar ciertas tareas, como mantenimiento de bases de datos, etc. pero también puede usarlo para llamar procesos almacenados cada n segundos.
Gracias, el problema es que veo demasiados servidores en los que el proceso de Sql Agent no se ejecuta para confiar en él. Esperaba algo integrado en SqlServer. –
El Agente de servidor Sql es una parte ** opcional ** del servidor SQL que a menudo está deshabilitado en los servidores. (¡No molesto a nuestros clientes!) –
Si desea mantener una ventana de consulta abierta SSMS:
While 1=1
Begin
exec "Procedure name here" ;
waitfor delay '00:00:15';
End
... o incluso dos ventanas SSMS, para alta disponibilidad? –
una vez que establecer un procedimiento almacenado que corrió de forma continua, uisng un bucle con un WAITFOR al final de la misma.
- La condición WHILE dependía del valor leído en una tabla de configuración simple. Si el valor se establece en 0, se saldrá del ciclo y se terminará el procedimiento.
- Puse un WAITFOR DELAY al final, de modo que, sin importar cuánto tiempo llevara procesar una iteración determinada, esperaría XX segundos hasta que se ejecutara de nuevo. (XX también se configuró y se leyó desde la tabla de configuración.)
- Si debe ejecutarse a intervalos exactos (por ejemplo, 0, 15, 30 y 45 segundos en el minuto), puede calcular el valor WATIFOR TIME apropiado en el final del ciclo
- Por último, tuve el procedimiento llamado por un trabajo del Agente de SQL una vez por minuto. El trabajo siempre estaría "ejecutándose" mostrando que el procedimiento se estaba ejecutando. Si el procedimiento se canceló o se bloqueó, el trabajo lo iniciaría en no más de 1 minuto. Si el procedimiento fue "desactivado", el procedimiento aún se ejecuta, pero el bucle WHILE que contiene el procesamiento no se ingresa y se genera el overhead.
No me gustaba mucho tenerlo en mi base de datos, pero cumplía con los requisitos del negocio.
Acabo de leer los otros comentarios. Si no es SQL Agent, ¿qué usas para asegurarte de que el proceso siempre se esté ejecutando? Y no importa lo que escribas, tanto los administradores habilidosos como los desafortunados títeres pueden meterse con tus cuidadosos preparativos. –
- 1. tiempo de espera cuando llame a un procedimiento almacenado en SQL Server 2008
- 2. Procedimiento almacenado a granel SQL llame a C#
- 3. cómo programar llamadas ajax cada N segundos?
- 4. Insertar proceso almacenado de actualización en SQL Server
- 5. ¿Cómo hacer que cada método de clase llame a un método específico antes de la ejecución?
- 6. Microsoft SQL Server - ¿Quién creó un Procedimiento almacenado?
- 7. ¿Hay alguna manera de configurar un trabajo de SQL Server programado para ejecutarse cada 30 segundos?
- 8. SQL Server - Cómo bloquear una mesa hasta que un procedimiento almacenado termina
- 9. jQuery ¿cómo hacer que el evento ocurra cada x segundos?
- 10. ¿Cómo puedo adjuntar y depurar un procedimiento almacenado de SQL Server almacenado?
- 11. ¿Cómo puedo llamar a un procedimiento almacenado de SQL Server desde PowerShell?
- 12. ¿Puede un proceso almacenado de SQL Server determinar el nombre del proc padre?
- 13. SQL Server: transacción de procedimiento almacenado
- 14. SQL Server para cada lazo
- 15. ¿Hay alguna razón para hacer que cada WCF llame a Async?
- 16. TSQL: llame a un procedimiento almacenado desde otro procedimiento almacenado y lea el resultado
- 17. ¿Cómo puedo hacer que una señal de Django llame a un método modelo?
- 18. SQL Server - SELECT FROM procedimiento almacenado
- 19. SQL Server 2000: ¿cómo salir de un procedimiento almacenado?
- 20. ¿Cómo guardo un procedimiento almacenado en SQL Server 2008 R2?
- 21. ¿Cómo creo condicionalmente un procedimiento almacenado en SQL Server?
- 22. SQL Server procedimiento almacenado conversión a paquete SSIS
- 23. T-Sql Cómo devolver una tabla desde un archivo almacenado en otro proceso almacenado
- 24. SQL Server procedimiento almacenado guía para principiantes
- 25. cómo hacer que un demonio proceso
- 26. Convierta "\ n" a nueva línea real en SQL Server
- 27. Cambiar el nombre de un procedimiento almacenado en SQL Server
- 28. Averigüe el procedimiento almacenado de llamada en SQL Server
- 29. MS SQL Server 2005 - Procedimiento almacenado "Interrupciones espontáneas"
- 30. Evitar que se llame a un método antes que otro
Pero eso requiere que tenga los bits de Service Broker instalados y habilitados (que también son opcionales), ¿no? ¿Cómo es esto mejor que SQL Agent? –
Los bits de Service Broker son parte del motor de SQL Server en sí (no instalación opcional). Las bases de datos individuales pueden tener SSB deshabilitada, pero de forma predeterminada está habilitada en todos los DB, excepto maestro y modelo. Está completamente contenido dentro de una base de datos (sin dependencias de msdb) por lo que puede viajar como una copia de seguridad/restauración a un nuevo host. Sobrevive a la conmutación por error de duplicación de DB sin ningún problema, una vez más porque no hay dependencias de msdb. Se escala y funciona * way * mejor que SQL Agent. Tiene capacidades de auto-equilibrio de carga a través de max_queue_readers. La activación se basa en la inserción, no en la extracción. Está en cada SQL Express. Y la lista sigue y sigue ... –
Si quiero que esto se ejecute continuamente para siempre, ¿cómo puedo "reiniciar automáticamente" en el vencimiento de la vida de la conversación o error? Intenté duplicar el bloque 'BEGIN DIALOG CONVERSATION' dentro del sproc, pero no funcionó. (No soy un experto en esto.) –