Ответ 1
Поскольку SQL Server Express не поставляется с SQL-агентом, вы можете использовать планировщик Windows для запуска SQLCMD с сохраненным proc или SQL script.
Как можно запускать хранимую процедуру в определенное время каждый день в SQL Server Express Edition?
Примечания:
Вопросы, относящиеся:
Поскольку SQL Server Express не поставляется с SQL-агентом, вы можете использовать планировщик Windows для запуска SQLCMD с сохраненным proc или SQL script.
Я нашел, что для меня работал следующий механизм.
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
Некоторые примечания:
Если вы используете Express Edition, вам нужно будет использовать планировщик Windows или приложение, подключающееся к серверу каким-либо образом.
Вы использовали планировщик для запуска sqlcmd. Вот несколько инструкций для получения sqlcmd, работающего с экспресс-выпуском.
Создайте запланированную задачу, которая вызывает "C:\YourDirNameHere\TaskScript.vbs" при запуске. VBScript должен выполнять повторное выполнение задачи (в этом примере это 15-минутный цикл)
Через командную строку (необходимо запустить cmd.exe как администратор):
schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP
Пример TaskScript.vbs: этот пользовательский SQL script без использования 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 script
@echo off
sqlcmd -S .\SQLEXPRESS -i %1
Планировщик SQL из http://www.lazycoding.com/products.aspx
Поскольку был задан еще один подобный вопрос и, вероятно, будет закрыт как дубликат этого, и есть много вариантов, не упомянутых в ответах, уже присутствующих здесь...
Поскольку вы используете SQL Express, вы не можете использовать агент SQL Server. Однако есть много альтернатив, все из которых вы можете планировать с помощью AT или Планировщик задач Windows в зависимости от вашей операционной системы:
Все эти языки/инструменты (и многие другие) имеют возможность подключения к SQL Server и выполнения хранимой процедуры. Вы также можете попробовать эти замены агента:
Самый простой способ решить эту проблему - создать запрос, который выполняет хранимую процедуру, а затем сохранит ее. Запрос должен выглядеть примерно так, как показано ниже.
use [database name]
exec storedproc.sql
Затем создайте командный файл с чем-то похожим на код ниже.
sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql
Затем планировщик задач выполняет пакет так часто, как вам нравится
Вы можете использовать Task Scheduler для запуска простого консольного приложения, которое выполнило бы оператор Sql.
Как вы правильно отметили, без процесса агента вам потребуется что-то еще внешнее по отношению к серверу, возможно, служба, которую вы пишете и установите, или планировщик Windows.
Обратите внимание, что при установке Express для локального приложения возможно, что машина не может быть включена в то время, когда вы хотите обрезать таблицу (скажем, вы устанавливаете ее для усечения каждую ночь в полночь, но пользователь никогда не имеет его машина включена).
Итак, ваша запланированная задача никогда не запускается, и ваш журнал аудита выходит из-под контроля (это также проблема с агентом SQL Server, но можно предположить, что реальный сервер будет работать без остановок). Лучшая стратегия, если эта ситуация подходит вам, может заключаться в том, чтобы приложение выполняло ее по требованию, когда обнаруживает, что прошло больше X дней с момента усечения или какой бы то ни было ваша операция.
Еще одна вещь, на которую стоит обратить внимание - это если вы говорите о веб-приложении, может быть время загрузки приложения, и операция может быть выполнена, когда это событие срабатывает.
Как упоминалось в комментарии, существует sp_procoption - это может позволить вашему SP запускаться каждый раз при запуске двигателя - недостатки с этот метод заключается в том, что для длительных экземпляров может существовать много времени между вызовами, и у него все еще возникают проблемы, если движок не работает в то время, когда требуется выполнить операцию.
Наша компания также использует SQLEXPRESS и не существует агента SQL.
Поскольку нет однозначного ответа как "права", и все решения довольно сложны, я поделюсь тем, что я там сделал. Может быть, это действительно плохо, но он отлично подействовал на меня.
Я выбрал операции Insertion (люди) для таблицы, которая получила тот же самый диапазон времени, который мне нужен, и сделал триггер "ON INSERT", который применяет необходимую функцию.