Ejecutar un Job de SQL Server Cada 30 Segundos

En la semana me vi con la necesidad de ejecutar un <<Job>> cada 30 segundos ó menos de un minuto, pero el detalle es que en el <<Management Studio>>, no puedo ingresar decimales, solamente puedo poner números enteros y seleccionar dos opciones de frecuencia siendo estas horas y minutos.


Buscando varias opciones encontré una característica no documentada de <<SQL Server>> que puede cambiar la programación de fecha a 30 segundos. Concretamente es un procedimiento almacenado que se llama: <<sp_update_jobschedule>> esta en <<msdb>>, para nuestro caso es el que podemos utilizar vía T-SQL y tiene los siguientes parametros.

  1. sp_update_jobschedule [@job_id =] job_id, | [@job_name =] 'job_name',  
  2.     [@name =] 'schedule_name'   
  3.     [, [@new_name =] 'new_schedule_name']  
  4.     [, [@enabled =] enabled]   
  5.     [, [@freq_type =] freq_type]  
  6.     [, [@freq_interval =] freq_interval]  
  7.     [, [@freq_subday_type =] freq_subday_type]  
  8.     [, [@freq_subday_interval =] freq_subday_interval]  
  9.     [, [@freq_relative_interval =] freq_relative_interval]  
  10.     [, [@freq_recurrence_factor =] freq_recurrence_factor]  
  11.     [, [@active_start_date =] active_start_date]  
  12.     [, [@active_end_date =] active_end_date]  
  13.     [, [@active_start_time =] active_start_time]  
  14.     [, [@active_end_time =] active_end_time]  


Si necesitas más detalles sobre el procedimiento almacenado puedes darle una leída a el MSDN acá. En los parámetros de arriba se muestran <<@freq_subday_type>> y <<@freq_subday_interval>> que son los que nos interesan por el momento. Los valores validos para <<@freq_subday_type>>:

ValueDescription (unit)
0x1At the specified time.
0x4Minutes.
0x8Hours.


Pero el valor 0x2 no esta documentado y es el que establece la unidad en segundos y <<@freq_subday_interval>> establece el número de periodos donde ocurrirá cada ejecución del <<Job>>, por defecto es <<NULL>>. Entonces para ejecutar el <<Job>> cada 30 segundos ó menos de un minuto es tener a la mano el <<job_name>> y el <<schedule_name>>.

Pasos para crear un <<Job>> de SQL Server que se ejecute cada 30 segundos.
  1. Crea un <<Job>> que se ejecute cada minuto.

2. Obtén los valores de <<job_name>>,<<job_id>>,<<schedule_name>> del <<Job>> que acabas de crear en el servidor, para esto podemos ejecutar la siguiente consulta T-SQL.

  1. select sj.job_id,sj.name as job_name,ss.name as schedule_name  
  2. from  msdb..sysjobs sj inner join msdb..sysjobschedules sjs  
  3. on sj.job_id=sjs.job_id  
  4. inner join msdb..sysschedules ss on ss.schedule_id=sjs.schedule_id  


3. Ejecuta el procedimiento <<sp_update_jobschedule>> con el parámetro <<@freq_subday_type>> igual a 0x2 y <<@freq_subday_interval>> igual al número de segundos que necesitas que se ejecute el <<Job>>, para mi caso es 30.

  1. exec msdb..sp_update_jobschedule @job_id = 'AE2AD631-BBD5-4195-A0DF-4BE166CA448D',  
  2. @name ='30Seconds_Schedule', @freq_subday_type =0x2, @freq_subday_interval=30 


4. ¡Disfruta!
Como dato curioso cuando intento ver las propiedades del <<Job>> desde el <<Management Studio>>, me tira un error y en la descripción, detalla que es porque la unidad mostrada no corresponde a las unidades por "Defecto".


Saludos + Gracias! Espero les sirva, fuente acá.

No hay comentarios:

Publicar un comentario