Запланированный запуск хранимой процедуры на сервере SQL - PullRequest
59 голосов
/ 13 ноября 2008

Можно ли как-то настроить Microsoft SQL Server для регулярного запуска хранимой процедуры?

Ответы [ 8 ]

97 голосов
/ 13 ноября 2008

Да, в MS SQL Server вы можете создавать запланированные задания. В SQL Management Studio перейдите на сервер, затем разверните элемент агента SQL Server и, наконец, папку «Задания» для просмотра, редактирования, добавления запланированных заданий.

37 голосов
/ 20 ноября 2009

Если используется MS SQL Server Express Edition, то агент SQL Server недоступен. Я нашел следующее работает для всех изданий:

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

Некоторые заметки:

17 голосов
/ 13 ноября 2008

Да, если вы используете агент SQL Server.

Откройте диспетчер предприятия и перейдите в папку «Управление» под интересующим вас экземпляром SQL Server. Там вы увидите агента SQL Server, а под ним - раздел «Задания».

Здесь вы можете создать новую работу и увидите список шагов, которые вам нужно будет создать. Когда вы создаете новый шаг, вы можете указать шаг для фактического запуска хранимой процедуры (типа TSQL Script). Выберите базу данных, а затем в командной строке введите что-то вроде:

exec MyStoredProcedure

Это обзор, напишите сюда, если вам понадобится дальнейший совет.

[Я действительно думал, что смогу войти первым, парень, я был неправ:)]

8 голосов
/ 07 марта 2014

Вероятно, не тот ответ, который вы ищете, но я считаю более полезным просто использовать Windows Server Task Scheduler

Вы можете напрямую использовать команду sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"

Или даже создать файл .bat. Таким образом, вы можете даже дважды щелкнуть по задаче.

К этому также подходили в этом ЗДЕСЬ

6 голосов
/ 13 ноября 2008

Я добавлю одну вещь: там, где я нахожусь, у нас было множество пакетных заданий, которые выполнялись каждую ночь. Однако мы переходим от этого к использованию клиентского приложения, запланированного в Windows по расписанию, которое запускает каждое задание. Для этого есть (как минимум) три причины:

  1. У нас есть некоторые консольные программы, которые также должны запускаться каждую ночь. Таким образом, все запланированные задачи могут быть в одном месте. Конечно, это создает единую точку отказа, но если консольные задания не запускаются, мы все равно потеряем работу на следующий день.
  2. Программа, которая запускает задания, собирает сообщения печати и ошибки с сервера и записывает их в общий журнал приложений для всех наших пакетных процессов. Это значительно упрощает ведение журналов с заданиями sql.
  3. Если нам когда-нибудь понадобится обновить сервер (и мы надеемся сделать это в ближайшее время), нам не нужно беспокоиться о переносе работы. Просто повторно укажите приложение.

Это очень короткое приложение на VB.Net: я могу опубликовать код, если кому-то интересно.

4 голосов
/ 28 января 2017

Вы можете использовать SQL Server Service Broker для создания пользовательского механизма.

Идея (упрощенная):

  1. Напишите хранимую процедуру / триггер, который начинает диалог ( BEGIN DIALOG ) в виде обратной петли (ОТ my_service TO my_service) - получить обработчик диалога

    DECLARE @dialog UNIQUEIDENTIFIER;
    
    BEGIN DIALOG CONVERSATION @dialog
            FROM SERVICE   [name] 
            TO SERVICE      'name' 
            ...;
    
  2. Запустить таймер разговора

    DECLARE @time INT;
    BEGIN CONVERSATION TIMER (@dialog)  TIMEOUT = @time;
    
  3. Через указанное количество секунд в службу будет отправлено сообщение. Он будет поставлен в очередь с соответствующей очередью.

    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. Процедура выполнит определенный код и повторно включаемый таймер для повторного запуска.


Вы можете найти полностью выпеченное решение (T-SQL), написанное Michał Gołoś под названием Планировщик заданий

Ключевые моменты из блога:

Плюсы:

  • Поддерживается в каждой версии (от Express до Enterprise). Задание агента SQL Server недоступно для SQL Server Express
  • Доступ к уровню базы данных. Вы можете легко переместить базу данных со связанными задачами (особенно если вам нужно переместить около 100 заданий из одного окружения в другое)
  • Пониженные привилегии, необходимые для просмотра / управления задачами (уровень базы данных)

Предлагаемое различие:

Агент SQL Server (обслуживание):

  • резервное копирование
  • Индекс / перестройка статистики
  • Репликация

Планировщик заданий (бизнес-процессы):

  • удаление старых данных
  • преагрегации / циклические пересчеты
  • денормализация

Как настроить:

  • получить исходный код из раздела: "Do pobrania" - Скачать (включение посредника / настройка схемы tsks / таблица конфигурации + триггеры + хранимая процедура) / настройка посредников)
  • настроить таблицу конфигурации [tsks].[tsksx_task_scheduler] для добавления новых задач (имена столбцов являются информативными, включая пример задачи)

Предупреждение. Блог написан на польском языке, но соответствующий исходный код написан на английском языке, и за ним легко следовать.

Предупреждение 2: Перед использованием убедитесь, что вы проверили его в непроизводственной среде.

4 голосов
/ 13 ноября 2008

Использование Management Studio - вы можете создать задание (без агента SQL Server) Одна работа может включать несколько шагов от сценариев T-SQL до пакетов служб SSIS

Джеб был быстрее;)

3 голосов
/ 13 ноября 2008

Вы должны посмотреть на задание , запланированное с использованием агента SQL Server .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...