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

问题描述:

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

注:

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

相关问题:

+0

这个职位看起来很有趣(在回答中引用到的相关问题之一): http://www.sqlteam.com/article/scheduling-jobs-in-sql-server-express – 2009-11-04 17:42:50

由于SQL Server Express中没有附带SQL代理,您可以使用Windows计划程序来运行一个存储过程或SQL脚本SQLCMD。

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

你可以使用任务计划触发一个简单的控制台应用程序,将执行SQL语句。

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

您将使用调度程序来运行sqlcmd。 Here are some instructions获取sqlcmd与快递版一起工作。

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

请注意,对于本地应用程序的快速安装,可能机器在截断表格时可能不打开(例如,您将其设置为每天晚上在截止时间截断,但用户从不有他的机器)。

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

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

正如在评论中提到的那样,有sp_procoption - 这可能允许您的SP在每次引擎启动时运行 - 此方法的缺点是对于长时间运行的实例,调用之间可能会有很长时间,如果在您需要执行操作的时候引擎未运行,它仍然存在问题。

+0

sp_procoption将允许存储程序自动运行。 – 2009-11-20 09:46:49

我发现了以下机制为我工作。

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 

一些注意事项:

  • 这是值得书写的地方审计条目,以便您可以看到该查询居然跑。
  • 服务器需要重新启动一次以确保脚本第一次运行。
+0

与审计线索的同时,我会添加到存储过程的工艺历史的检验,这样,如果没有在24小时或任何运行 - 继续前进,在启动时运行的进程。这将处理机器在夜间或偶尔夜间或类似情况下关闭的情况(根据需要启动的虚拟机)。 – 2009-11-20 14:46:28

+0

好点!对于我们的情况,数据库不断运行,因为它是一个全天候运行的客户系统。我想知道最简单的事情是在等待之前运行'MyDatabaseStoredProcedure'脚本吗?在我们的情况下,这将工作得很好,但它可能不适用于不同的应用程序要求。 – 2009-11-26 07:40:43

+0

有没有任何缺点让程序在后台不断运行? – tufelkinder 2014-07-16 18:59:06

SQL调度http://www.lazycoding.com/products.aspx

  • 自由和简单
  • 支持SQL Server 2000中,2005的所有版本,和2008年
  • 支持无限SQL Server实例不限数量的就业岗位。
  • 可以轻松地安排SQL服务器维护任务:备份,索引重建,完整性检查等
  • 运行作为Windows服务岗位上的成功和失败

  • 电子邮件通知自其他类似的问题被问了,并且可能会被作为这个副本关闭,并且在这里已经存在的答案中没有提到许多选项...

    由于您使用的是SQL Express,因此无法使用S QL服务器代理。但是也有很多的选择,所有这些都可以使用ATWindows Task Scheduler根据您的操作系统上安排:

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

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

    通过命令行(必须运行CMD.EXE作为管理员):

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

    例TaskScript.vbs:此执行您的自定义SQL脚本静静地使用RunSQLScript。蝙蝠

    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 
    
    +0

    +1尼斯答案:) – 2014-03-07 09:27:15

    +0

    我需要修复的任务调度命令(通过命令行)。事实证明,它不会在下次启动时自动重新启动,我必须手动更正它。我将在稍后编辑和修复代码,只是希望人们意识到。执行代码虽然工作得很好。 – VoteCoffee 2014-03-10 14:04:26

    +0

    仍然很忙?或者您是否有时间修复命令以完成此答案? – 2015-02-24 14:10:25

    我已经找到了解决这个问题的最简单的方法是创建一个执行一个查询存储过程然后保存它。该查询应该看起来类似于下面的这个。

     use [database name] 
        exec storedproc.sql 
    

    然后创建一个类似下面的代码在它的东西一个批处理文件。

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

    然后有任务调度执行批处理往往你喜欢

    公司还使用SQLEXPRESS并没有SQL代理。

    由于没有明显的答案是“正确的”,所有的解决方案都相当复杂,我会分享我那里做。可能是它真的很糟糕,但它对我很好。

    我选择插入(人行)的操作,进行了密切的我所需要的相同时间范围,并提出了触发“ON INSERT”适用需要功能的表。