Ejecución programada del procedimiento almacenado en SQL server


¿Es posible configurar de alguna manera Microsoft SQL Server para ejecutar un procedimiento almacenado de forma regular?

Author: marc_s, 2008-11-13

8 answers

Sí, en MS SQL Server, puede crear trabajos programados. En SQL Management Studio, vaya al servidor, expanda el elemento Agente de SQL Server y, finalmente, la carpeta Trabajos para ver, editar y agregar trabajos programados.

 92
Author: Jeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 16:20:16

Si se utiliza MS SQL Server Express Edition, el agente de SQL Server no está disponible. Encontré lo siguiente trabajado para todas las ediciones:

USE Master
GO

IF  EXISTS( SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(N'[dbo].[MyBackgroundTask]')
            AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[MyBackgroundTask]
GO

CREATE PROCEDURE MyBackgroundTask
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- The interval between cleanup attempts
    declare @timeToRun nvarchar(50)
    set @timeToRun = '03:33:33'

    while 1 = 1
    begin
        waitfor time @timeToRun
        begin
            execute [MyDatabaseName].[dbo].[MyDatabaseStoredProcedure];
        end
    end
END
GO

-- Run the procedure when the master database starts.
sp_procoption    @ProcName = 'MyBackgroundTask',
                @OptionName = 'startup',
                @OptionValue = 'on'
GO

Algunas notas:

 35
Author: Thomas Bratt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:41

Sí, si utiliza el agente SQL Server.

Abra Enterprise Manager y vaya a la carpeta de administración bajo la instancia de SQL Server que le interesa. Allí verá el agente de SQL Server, y debajo verá una sección de Trabajos.

Aquí puede crear un nuevo trabajo y verá una lista de pasos que necesitará crear. Cuando crea un nuevo paso, puede especificar el paso para ejecutar realmente un procedimiento almacenado (escriba el script TSQL). Elija la base de datos, y luego para la sección de comandos ponga algo como:

exec MyStoredProcedure

Ese es el resumen, publique aquí si necesita más consejos.

[En realidad pensé que podría entrar primero en este, chico estaba equivocado :)]

 17
Author: Ciaran Archer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 14:35:44

Probablemente no sea la respuesta que está buscando, pero me parece más útil simplemente usar El Programador de tareas de Windows Server

Puede utilizar directamente el comando sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"

O incluso crear un archivo .bat. Por lo tanto, incluso puede hacer clic 2 veces en la tarea bajo demanda.

Esto también se ha abordado en este AQUÍ

 7
Author: percebus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:25

Agregaré una cosa: donde estoy, solíamos tener un montón de trabajos por lotes que se ejecutaban todas las noches. Sin embargo, nos estamos alejando de eso para usar una aplicación cliente programada en tareas programadas de Windows que inicia cada trabajo. Hay (al menos) tres razones para esto:

  1. Tenemos algunos programas de consola que también necesitan ejecutarse todas las noches. De esta manera, todas las tareas programadas pueden estar en un solo lugar. Por supuesto, esto crea un único punto de error, pero si los trabajos de consola no se ejecutan vamos a perder un día de trabajo al día siguiente de todos modos.
  2. El programa que inicia los trabajos captura mensajes de impresión y errores del servidor y los escribe en un registro de aplicación común para todos nuestros procesos por lotes. Hace que el registro de los trabajos sql sea mucho más simple.
  3. Si alguna vez necesitamos actualizar el servidor (y esperamos hacerlo pronto) no necesitamos preocuparnos por mover los trabajos. Solo vuelve a apuntar la aplicación una vez.

Es un verdadero corto VB.Net aplicación: I puede código postal si alguien está interesado.

 6
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-14 14:50:59

Usando Management Studio-puede crear un trabajo (agente de unter SQL Server) Un trabajo puede incluir varios pasos desde scripts T-SQL hasta Paquetes SSIS

Jeb fue más rápido;)

 4
Author: Bluenuance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 14:28:32

Usted podría utilizar Agente de Servicio de SQL Server para crear un mecanismo a medida.

Idea (simplificada):

  1. Escribir un procedimiento almacenado/disparador que inicia una conversación ( INICIAR DIÁLOGO ) como bucle invertido (DE mi_servicio A mi_servicio) - obtener controlador de conversación

    DECLARE @dialog UNIQUEIDENTIFIER;
    
    BEGIN DIALOG CONVERSATION @dialog
            FROM SERVICE   [name] 
            TO SERVICE      'name' 
            ...;
    
  2. Iniciar el temporizador de conversación

    DECLARE @time INT;
    BEGIN CONVERSATION TIMER (@dialog)  TIMEOUT = @time;
    
  3. Después de un número especificado de segundos, se enviará un mensaje a un servicio. Será encolerizado con cola asociada.

    CREATE QUEUE queue_name WITH STATUS = ON, RETENTION = OFF
                 , ACTIVATION (STATUS = ON, PROCEDURE_NAME = <procedure_name>
                 , MAX_QUEUE_READERS = 20, EXECUTE AS N'dbo')
                  , POISON_MESSAGE_HANDLING (STATUS = ON) 
    
  4. Procedure ejecutará un código específico y un temporizador reanimable para que se dispare de nuevo.


Puede encontrar una solución completamente horneada (T-SQL) escrita por Michał Gołoś llamada Programador de Tareas

Puntos clave del blog:

Ventajas:

  • Soportado en cada versión (de Express a Enterprise). El trabajo de agente de SQL Server no está disponible para SQL Server Express
  • Ámbito a nivel de base de datos. Puede mover fácilmente la base de datos con tareas asociadas (especialmente cuando tiene que mover alrededor de 100 trabajos de un enviromnent a otro)
  • Se necesitan privilegios más bajos para ver/manipular tareas(nivel de base de datos)

Distinción propuesta:

Agente de SQL Server (mantenimiento):

  • copias de seguridad
  • index / statistics reconstruye
  • replicación

Programador de tareas (procesos de negocio):

  • eliminación datos antiguos
  • preagregaciones / nuevos cálculos cíclicos
  • desnormalización

Cómo configurarlo:

  • obtenga el código fuente de la sección: "Do pobrania" - Para descargar (habilitar broker/configurar esquema tsks/tabla de configuración + disparadores + procedimiento almacenado)/configurar cosas broker)
  • configure la tabla de configuración [tsks].[tsksx_task_scheduler] para agregar nuevas tareas (los nombres de las columnas son auto-descriptivos, incluida la tarea de ejemplo)

Advertencia: Blog es escrito en polaco, pero el código fuente asociado está en inglés y es fácil de seguir.

Advertencia 2: Antes de usarlo, asegúrese de haberlo probado en un entorno que no sea de producción.

 4
Author: Lukasz Szozda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-30 15:12:48
 3
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 14:28:54