如何在SQL Server Express Edition中每天运行存储过程?

时间:2009-11-04 17:00:51

标签: sql sql-server sql-server-express scheduled-tasks

如何在SQL Server Express Edition中每天的特定时间运行存储过程?

注意:

  • 需要截断审计表
  • 另一种方法是修改插入查询,但这可能效率较低
  • SQL Server Express Edition没有SQL Server代理

相关问题:

11 个答案:

答案 0 :(得分:24)

由于SQL Server Express没有附带SQL Agent,因此您可以使用Windows调度程序运行带有存储过程或SQL脚本的SQLCMD。

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

答案 1 :(得分:8)

我发现以下机制对我有用。

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

一些注意事项:

  • 值得在某处编写审核条目,以便您可以看到查询实际运行。
  • 服务器需要重启一次,以确保脚本第一次运行。

答案 2 :(得分:4)

如果您使用的是Express Edition,则需要以某种方式使用Windows Scheduler或连接到服务器的应用程序。

您可以使用调度程序运行sqlcmd。 Here are some instructions让sqlcmd使用快速版。

答案 3 :(得分:4)

创建一个在启动时调用“C:\ YourDirNameHere \ TaskScript.vbs”的计划任务。 VBScript应该执行重复的任务执行(在这个例子中,它是一个15分钟的循环)

通过命令行(必须以管理员身份运行cmd.exe):

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

答案 4 :(得分:2)

来自http://www.lazycoding.com/products.aspx

SQL计划程序

  • 自由而简单
  • 支持所有版本的SQL Server 2000,2005和2008
  • 支持无限数量的作业的无限SQL Server实例。
  • 允许轻松安排SQL Server维护任务:备份,索引重建,完整性检查等。
  • 作为Windows服务运行
  • 有关工作成功与失败的电子邮件通知

答案 5 :(得分:1)

由于提出了另一个类似的问题,并且很可能会将其作为此副本的副本关闭,并且此处已有的答案中未提及许多选项......

由于您使用的是SQL Express,因此无法使用SQL Server代理。但是,有许多替代方案,您可以根据您的操作系统使用ATWindows Task Scheduler安排所有替代方案:

所有这些语言/工具(以及许多其他语言/工具)都能够连接到SQL Server并执行存储过程。您还可以尝试这些代理替换:

答案 6 :(得分:1)

我发现解决此问题的最简单方法是创建一个执行存储过程然后保存的查询。查询应该与下面的查询类似。

     use [database name]
     exec storedproc.sql

然后创建一个类似于下面代码的批处理文件。

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

然后让任务调度程序根据需要随时执行批处理

答案 7 :(得分:1)

在SQL Express中进行调度的另一种方法是使用Service Broker Conversation Timers。要定期运行存储过程,可以用来引导自定义调度程序。

例如参见Scheduling Jobs in SQL Server Express

答案 8 :(得分:0)

您可以使用任务计划程序来启动将执行Sql语句的简单控制台应用程序。

答案 9 :(得分:0)

正如您已经正确指出的那样,如果没有代理进程,您将需要服务器外部的其他内容,可能是您编写和安装的服务或Windows调度程序。

请注意,对于本地应用程序的Express安装,可能在您要截断表时机器可能未打开(假设您将其设置为每晚午夜截断,但用户从未拥有他的机器)。

因此,您的计划任务永远不会运行,您的审计日志也会失控(这也是SQL Server代理的问题,但人们会认为真正的服务器将不间断运行)。如果这种情况适合您的话,更好的策略可能是让应用程序在检测到截断后的X天或者您的操作时间超过X天时按需执行。

另一件需要注意的事情是,如果您正在讨论Web应用程序,可能有时间加载应用程序,并且可以在该事件触发时执行操作。

如评论中所述,有sp_procoption - 这可能允许您的SP在每次启动引擎时运行 - 此方法的缺点是对于长时间运行的实例,可能需要很长时间在调用之间,如果引擎在你需要完成操作的时候没有运行,它仍然会出现问题。

答案 10 :(得分:0)

我们公司也使用SQLEXPRESS,没有SQL Agent。

由于没有明确的答案为“正确”,所有解决方案都非常复杂,我将分享我在那里所做的事情。可能是它真的很糟糕,但它对我很有用。

我选择了Insertion(人们做)的操作到一个表格,该表格与我需要的时间范围非常接近,并且触发了“ON INSERT”以应用所需的功能。