如何在SQL Server Express Edition中每天的特定时间运行存储过程?
注:
- 这是为了清空审计表而需要的操作。
- 另一种替代方案是修改插入查询,但这可能不太高效。
- SQL Server Express Edition没有SQL Server Agent。
相关问题:
如何在SQL Server Express Edition中每天的特定时间运行存储过程?
注:
相关问题:
由于 SQL Server Express 不带有 SQL Agent,您可以使用 Windows 计划程序来运行一个包含存储过程或 SQL 脚本的 SQLCMD。
我发现以下机制适用于我。
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
一些注意事项:
schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP
示例TaskScript.vbs:使用RunSQLScript.bat静默执行您的自定义SQL脚本
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
SQL Scheduler 来自 http://www.lazycoding.com/products.aspx
我发现解决这个问题最简单的方法是创建一个查询来执行存储过程,然后保存它。查询应该类似于下面的示例。
use [database name]
exec storedproc.sql
sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql
由于已经有一个类似的问题被问到了,而且很可能会被关闭作为这个问题的重复,并且在已经存在的答案中没有提到许多选项...
由于您正在使用SQL Express,因此无法使用SQL Server Agent。但是有许多替代方案,所有这些方案都可以使用 AT或 Windows任务计划程序进行调度,具体取决于您的操作系统:
所有这些语言/工具(以及许多其他工具)都可以连接到SQL Server并执行存储过程。您还可以尝试这些代理程序替代品:请参阅例如在SQL Server Express中安排作业。
正如您所指出的,如果没有代理进程,您将需要其他外部服务来执行此操作,例如编写和安装服务或使用Windows计划任务。
请注意,在本地应用程序的Express安装中,可能会出现这样的情况:在您想要截断表格的时间(比如每晚午夜),机器可能没有开启(用户从未开启机器)。
因此,您的定时任务永远不会运行,您的审计日志也会失控(这也是SQL Server代理的问题,但人们会认为真正的服务器应该是不间断运行的)。如果这种情况适合您,请采用更好的策略,即当应用程序检测到自上次截断以来已经过了X天或者进行了其他操作时,按需执行。
另一个需要考虑的问题是,如果您正在谈论Web应用程序,可能会有应用程序加载的时间,并且可以在该事件触发时执行操作。
如评论中所提到的,有sp_procoption - 这可能允许您的SP在每次启动引擎时运行 - 此方法的缺点是对于长时间运行的实例,可能会在调用之间花费很长时间,并且如果在需要执行操作的时间引擎没有运行,则仍然存在问题。