Как запускать хранимую процедуру каждый день в SQL Server Express Edition?

Как можно запускать хранимую процедуру в определенное время каждый день в SQL Server Express Edition?

Примечания:

  • Это необходимо для усечения таблицы аудита.
  • Альтернативой было бы изменение запроса на вставку, но это, вероятно, менее эффективно.
  • SQL Server Express Edition не имеет агента SQL Server

Связанные вопросы:


person Thomas Bratt    schedule 04.11.2009    source источник
comment
Этот пост выглядит интересным (на него есть ссылка в ответе на один из связанных вопросов): sqlteam.com/article/scheduling-jobs-in-sql-server-express   -  person Thomas Bratt    schedule 04.11.2009


Ответы (11)


Поскольку SQL Server Express не поставляется с агентом SQL, вы можете использовать планировщик Windows для запуска SQLCMD с сохраненной процедурой или сценарием SQL.

http://msdn.microsoft.com/en-us/library/ms162773.aspx

person Raj More    schedule 04.11.2009

Я обнаружил, что у меня работает следующий механизм.

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

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

  • Стоит написать где-нибудь запись аудита, чтобы вы могли видеть, что запрос действительно выполнен.
  • Сервер необходимо перезагрузить один раз, чтобы сценарий запустился в первый раз.
person Thomas Bratt    schedule 20.11.2009
comment
В сочетании с вашим контрольным следом я бы добавил к этой хранимой процедуре проверку истории процесса, чтобы, если она не была запущена в течение 24 часов или что-то еще - продолжить и запустить процесс при запуске. Это будет обрабатывать случаи, когда машина выключается на ночь или изредка ночью или что-то подобное (виртуальная машина, которая запускается по запросу). - person Cade Roux; 20.11.2009
comment
Хорошая точка зрения! В нашем случае база данных работает постоянно, так как это клиентская система, работающая круглосуточно и без выходных. Интересно, самое простое - запустить скрипт MyDatabaseStoredProcedure перед ожиданием? В нашем случае это будет работать нормально, но не для других требований приложения. - person Thomas Bratt; 26.11.2009
comment
Есть ли недостатки у постоянной работы процедуры в фоновом режиме? - person tufelkinder; 16.07.2014
comment
Минусы: 1. Придется создавать новый хранимый процесс каждый раз, когда вам нужно запланировать задание 2. Перезагрузка при каждом изменении расписания. - person Raj More; 22.09.2014
comment
Вы можете обойтись без перезагрузки, создав таблицу с флагом выполнения для каждой запланированной задачи. Установите флаг в верхней части сохраненного процесса задачи и используйте его в условии while. Очистка флага приведет к остановке после завершения текущей итерации. Я также рекомендовал бы иметь таблицу, чтобы вы могли хранить время последнего запуска и продолжительность для диагностических целей. - person VoteCoffee; 15.04.2015
comment
Процедура sp_procoption, инструкция CONFIG не поддерживается в этой версии SQL Server. - person Eng Soon Cheah; 28.11.2020

Создайте запланированную задачу, которая при запуске вызывает «C: \ YourDirNameHere \ TaskScript.vbs». VBScript должен выполнять повторное выполнение задачи (в этом примере это 15-минутный цикл)

Через командную строку (необходимо запустить cmd.exe от имени администратора):

schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP

Пример TaskScript.vbs: автоматически выполняет ваш собственный сценарий SQL с помощью RunSQLScript.bat

Do While 1
    WScript.Sleep(60000*15)
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.RUN "cmd /c C:\YourDirNameHere\RunSQLScript.bat C:\YourDirNameHere\Some_TSQL_Script.sql", 0
Loop

RunSQLScript.bat: использует sqlcmd для вызова экземпляра базы данных и выполнения сценария SQL.

@echo off
sqlcmd -S .\SQLEXPRESS -i %1
person VoteCoffee    schedule 06.03.2014
comment
Мне нужно исправить команду расписания задач (через командную строку). Оказывается, он не перезапускается автоматически при следующей загрузке, и мне пришлось вручную исправить это. Я отредактирую и исправлю код позже, просто хочу, чтобы люди знали. Хотя код выполнения работает отлично. - person VoteCoffee; 10.03.2014
comment
До сих пор занят? Или у вас есть время исправить команду, чтобы этот ответ был полным? - person Hugo Delsing; 24.02.2015
comment
Я понял, что нужная мне настройка является расширенной и не поддерживается schtask.exe. Вместо этого я предпочел, чтобы vbs выполнял функцию повтора и запускал его при запуске. Теперь хорошо. - person VoteCoffee; 27.02.2015

Если вы используете Express Edition, вам нужно будет использовать планировщик Windows или приложение, каким-либо образом подключающееся к серверу.

Вы должны использовать планировщик для запуска sqlcmd. Вот несколько инструкций по получению sqlcmd, работающий с экспресс-выпуском.

person Yishai    schedule 04.11.2009


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

Поскольку вы используете SQL Express, вы не можете использовать агент SQL Server. Однако существует множество альтернатив, все из которых можно запланировать с помощью AT или Планировщик задач Windows в зависимости от вашей операционной системы. :

Все эти языки / инструменты (и многие другие) могут подключаться к SQL Server и выполнять хранимую процедуру. Вы также можете попробовать эти замены агента:

person Aaron Bertrand    schedule 12.03.2013
comment
Ссылка SQLScheduleer мертва. - person done_merson; 24.10.2020

Самый простой способ решить эту проблему, который я нашел, - это создать запрос, который выполняет хранимую процедуру, а затем сохранить его. Запрос должен выглядеть примерно так, как показано ниже.

     use [database name]
     exec storedproc.sql

Затем создайте командный файл с чем-то похожим на приведенный ниже код.

sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql

Затем пусть планировщик задач выполняет пакет так часто, как вам нравится.

person BrianMichaels    schedule 22.09.2014

Другой подход к планированию в SQL Express - использовать Таймеры разговора компонента Service Broker. Для периодического запуска хранимой процедуры, которую можно использовать для загрузки настраиваемого планировщика.

См., Например, Планирование заданий в SQL Server Express

person David Browne - Microsoft    schedule 23.12.2018

Вы можете использовать планировщик задач для запуска простого консольного приложения, которое будет выполнять инструкцию Sql.

person Craig Bart    schedule 04.11.2009

Как вы правильно заметили, без процесса агента вам понадобится что-то еще внешнее по отношению к серверу, возможно, служба, которую вы пишете и устанавливаете, или планировщик Windows.

Обратите внимание, что при экспресс-установке для локального приложения возможно, что компьютер может не быть включен в то время, когда вы хотите усечь таблицу (скажем, вы настроили его на усечение каждую ночь в полночь, но пользователь никогда не включает свою машину ).

Таким образом, ваша запланированная задача никогда не запускается, и ваш журнал аудита выходит из-под контроля (это также проблема с агентом SQL Server, но можно было бы предположить, что реальный сервер будет работать без остановок). Лучшая стратегия, если эта ситуация подходит вам, может заключаться в том, чтобы приложение выполняло это по требованию, когда оно обнаруживает, что с момента усечения или какой-либо другой операции прошло более X дней.

Еще одна вещь, на которую следует обратить внимание, - если вы говорите о веб-приложении, может быть время, когда приложение загружается, и операция может быть выполнена при возникновении этого события.

Как упоминалось в комментарии, существует sp_procoption - это может позволить вашему SP запускается каждый раз при запуске двигателя - недостатки этого метода заключаются в том, что для длительно работающих экземпляров может быть много времени между вызовами, и у него все еще есть проблемы, если двигатель не работает в то время, когда вам нужна операция должно быть сделано.

person Cade Roux    schedule 04.11.2009
comment
sp_procoption позволит хранимой процедуре запускаться автоматически. - person Thomas Bratt; 20.11.2009

Наша компания также использует SQLEXPRESS и отсутствует агент SQL.

Поскольку нет ответа, помеченного как «правильный», и все решения довольно сложные, я расскажу, что я там сделал. Может быть, это действительно плохо, но для меня это сработало отлично.

Я выбрал операции вставки (люди делают) в таблицу, которая имеет тот же временной диапазон, который мне нужен, и сделал триггер «ON INSERT», который применяет нужную функцию.

person KennyKivi    schedule 20.02.2017