Запланированный запуск хранимой процедуры на сервере SQL

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

Ответ 1

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

Ответ 2

Если 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

Некоторые примечания:

Ответ 3

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

Откройте свой Enterprise Manager и перейдите в папку "Управление" в интересующем вас экземпляре SQL Server. Там вы увидите Агент SQL Server, и под ним вы увидите раздел "Вакансии".

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

exec MyStoredProcedure

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

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

Ответ 4

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

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

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

К этому также обратились HERE

Ответ 5

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

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

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

Ответ 6

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

Jeb был быстрее;)

Ответ 8

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

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

  • Напишите хранимую процедуру/триггер, начинающий разговор (BEGIN DIALOG) как loopback (FROM my_service TO my_service) - получите обработчик беседы

    DECLARE @dialog UNIQUEIDENTIFIER;
    
    BEGIN DIALOG CONVERSATION @dialog
            FROM SERVICE   [name] 
            TO SERVICE      'name' 
            ...;
    
  • Запустите таймер беседы

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

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


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

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

Плюсы:

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

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

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

  • подпорки
  • индексы/статистические перестройки
  • Репликация

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

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

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

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

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

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