Execução agendada de procedimento armazenado no servidor SQL

É possível configurar de alguma forma o Microsoft SQL Server para executar um procedimento armazenado em base regular?

Sim, no MS SQL Server, você pode criar tarefas agendadas. No SQL Management Studio, navegue até o servidor e, em seguida, expanda o item do SQL Server Agent e, finalmente, a pasta Jobs para exibir, editar e adicionar trabalhos agendados.

Se o MS SQL Server Express Edition estiver sendo usado, o SQL Server Agent não estará disponível. Eu encontrei o seguinte trabalhado para todas as edições:

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 

Algumas notas:

  • Vale a pena escrever uma input de auditoria em algum lugar para que você possa ver que a consulta realmente foi executada.
  • O servidor precisa ser reinicializado uma vez para garantir que o script seja executado pela primeira vez.
  • Uma pergunta relacionada é: Como executar um procedimento armazenado todos os dias no SQL Server Express Edition?

Sim, se você usar o SQL Server Agent.

Abra o Enterprise Manager e vá para a pasta Management na instância do SQL Server em que você está interessado. Lá você verá o SQL Server Agent e, abaixo dele, você verá uma seção Jobs.

Aqui você pode criar um novo trabalho e você verá uma lista de etapas que você precisará criar. Quando você cria uma nova etapa, você pode especificar a etapa para realmente executar um procedimento armazenado (digite o script TSQL). Escolha o database e, em seguida, para a seção de comando, coloque algo como:

 exec MyStoredProcedure 

Essa é a visão geral, poste aqui se precisar de mais conselhos.

[Eu realmente pensei que poderia entrar primeiro nessa, garoto, eu estava errado :)]

Provavelmente não é a resposta que você está procurando, mas eu acho mais útil simplesmente usar o Agendador de Tarefas do Windows Server

Você pode usar diretamente o comando sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob" sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"

Ou até mesmo criar um arquivo .bat . Então você pode até mesmo 2x clicar na tarefa por demanda.

Isso também foi abordado neste AQUI

Eu adicionarei uma coisa: onde estou, costumamos ter um monte de trabalhos em lote que aconteciam todas as noites. No entanto, estamos nos afastando disso para usar um aplicativo cliente agendado em tarefas agendadas do Windows que inicie cada trabalho. Existem (pelo menos) três razões para isso:

  1. Temos alguns programas de console que precisam ser executados todas as noites também. Desta forma, todas as tarefas agendadas podem estar em um só lugar. Claro, isso cria um ponto único de falha, mas se os trabalhos do console não forem executados, perderemos um dia de trabalho no dia seguinte de qualquer maneira.
  2. O programa que inicia os trabalhos captura mensagens de impressão e erros do servidor e os grava em um log de aplicativo comum para todos os nossos processos em lote. Isso faz com que o log dos trabalhos SQL seja muito mais simples.
  3. Se precisarmos atualizar o servidor (e esperamos fazer isso em breve), não precisamos nos preocupar em mudar os trabalhos. Apenas aponte novamente o aplicativo uma vez.

É um aplicativo VB.net muito curto: posso postar código se houver alguém interessado.

Usando o Management Studio – você pode criar um trabalho (unter SQL Server Agent) Um trabalho pode include vários passos de scripts T-SQL até pacotes SSIS

Jeb foi mais rápido;)

Você pode usar o SQL Server Service Broker para criar um mecanismo personalizado.

Idéia (simplificada):

  1. Grave um procedimento / gatilho armazenado que inicie uma conversa ( BEGIN DIALOG ) como loopback (FROM my_service TO my_service) – obtenha o manipulador de conversas

     DECLARE @dialog UNIQUEIDENTIFIER; BEGIN DIALOG CONVERSATION @dialog FROM SERVICE [name] TO SERVICE 'name' ...; 
  2. Inicie o timer de conversação

     DECLARE @time INT; BEGIN CONVERSATION TIMER (@dialog) TIMEOUT = @time; 
  3. Após o número especificado de segundos, uma mensagem será enviada para um serviço. Ele será enfileirado com a fila associada.

     CREATE QUEUE queue_name WITH STATUS = ON, RETENTION = OFF , ACTIVATION (STATUS = ON, PROCEDURE_NAME =  , MAX_QUEUE_READERS = 20, EXECUTE AS N'dbo') , POISON_MESSAGE_HANDLING (STATUS = ON) 
  4. O procedimento executará o código específico e o timer reutilizável para triggersr novamente.


Você pode encontrar uma solução completa (T-SQL) escrita por Michał Gołoś, chamada Task Scheduler

Pontos-chave do blog:

Prós:

  • Suportado em cada versão (do Express para Enterprise). O trabalho do SQL Server Agent não está disponível para o SQL Server Express
  • Escopo para o nível do database. Você pode facilmente mover database com tarefas associadas (especialmente quando você tem que mover cerca de 100 postos de trabalho de um ambiente para outro)
  • Menores privilégios necessários para ver / manipular tarefas (nível de database)

Proposta de distinção:

Agente do SQL Server (manutenção):

  • backups
  • reconstruções de índices / statistics
  • replicação

Agendador de Tarefas (processos de negócios):

  • removendo dados antigos
  • pré-agregações / recálculos cíclicos
  • desnormalização

Como configurá-lo:

  • obter código-fonte da seção: “Do pobrania” – Para fazer o download (permitindo o agente / configuração de tsks de esquema / tabela de configuração + triggers + procedimento armazenado) / configurando coisas do corretor)
  • configure a tabela de configuração [tsks].[tsksx_task_scheduler] para adicionar novas tarefas (nomes de colunas são auto-descritivos, tarefa de amostra incluída)

Aviso: o blog é escrito em polonês, mas o código fonte associado está em inglês e é fácil de seguir.

Aviso 2: Antes de usá-lo, certifique-se de testá-lo em um ambiente que não seja de produção.

Você deve examinar um job planejado usando o SQL Server Agent .