计划在SQL Server上运行存储过程

是否可以设置Microsoft SQL Server定期运行存储过程?

是的,在MS SQL Server中,您可以创build计划作业。 在SQL Management Studio中,导航到服务器,然后展开SQL Server代理项目,最后展开作业文件夹以查看,编辑和添加预定作业。

如果正在使用MS SQL Server Express Edition,则SQL Server Agent不可用。 我发现以下适用于所有版本:

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 

一些说明:

  • 值得在某处写一个审计条目,这样就可以看到查询实际上运行了。
  • 服务器需要重新启动一次,以确保脚本第一次运行。
  • 一个相关的问题是: 如何在SQL Server Express Edition中每天运行一个存储过程?

是的,如果您使用SQL Server代理。

打开您的企业pipe理器,然后转到您感兴趣的SQL Server实例下的Management文件夹。在那里您将看到SQL Server代理,在下面您将看到一个Jobs部分。

在这里你可以创build一个新的工作,你会看到你需要创build的步骤列表。 创build新步骤时,可以指定实际运行存储过程的步骤(键入TSQL脚本)。 select数据库,然后为命令部分放入类似于:

 exec MyStoredProcedure 

这是概述,如果您需要任何进一步的build议,请回到这里。

[我其实以为自己可能首先得到这个,男孩是我错了:)]

可能不是你正在寻找的答案,但是我发现简单地使用Windows Server Task Scheduler更有用

您可以直接使用命令sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob" sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"

甚至创build一个.bat文件。 所以你甚至可以按两下点击任务。

这在这里也接近了

我会添加一件事情:我在哪里,我们曾经有一堆每天晚上运行的批处理作业。 但是,我们正在从使用Windows预定任务中安排的客户端应用程序开始,这些应用程序将启动每个作业。 至less有三个原因:

  1. 我们有一些控制台程序也需要每晚运行。 这样所有的计划任务可以在一个地方。 当然,这会造成一个单一的失败点,但是如果控制台作业不运行,我们将在第二天失去一天的工作。
  2. 启动作业的程序从服务器捕获打印消息和错误,并将它们写入到所有批处理过程的通用应用程序日志中。 它使从SQL工作日志logging更简单。
  3. 如果我们需要升级服务器(我们希望能很快做到这一点),我们不必担心移动工作。 只需重新指定应用程序一次。

这是一个真正的简短的VB.Net应用程序:如果任何人感兴趣,我可以发布代码。

使用Management Studio – 您可以创build一个作业(unter SQL Server代理)一个作业可能包括从T-SQL脚本到SSIS包的几个步骤

杰布速度更快;)

您应该查看使用SQL Server代理预定的作业 。

您可以使用SQL Server Service Broker来创build自定义机制。

想法(简化):

  1. 写一个存储过程/触发器开始对话( BEGIN DIALOG )作为回送(从my_service到my_service) – 获取对话处理程序

     DECLARE @dialog UNIQUEIDENTIFIER; BEGIN DIALOG CONVERSATION @dialog FROM SERVICE [name] TO SERVICE 'name' ...; 
  2. 启动会话计时器

     DECLARE @time INT; BEGIN CONVERSATION TIMER (@dialog) TIMEOUT = @time; 
  3. 在指定的秒数之后,消息将被发送到服务。 它将被列入关联的队列。

     CREATE QUEUE queue_name WITH STATUS = ON, RETENTION = OFF , ACTIVATION (STATUS = ON, PROCEDURE_NAME = <procedure_name> , MAX_QUEUE_READERS = 20, EXECUTE AS N'dbo') , POISON_MESSAGE_HANDLING (STATUS = ON) 
  4. 过程将执行特定的代码和可重新启动的定时器再次触发。


您可以findMichałGołoś编写的完整解决scheme(T-SQL),称为Task Scheduler

博客要点:

优点:

  • 支持每个版本(从Express到Enterprise)。 SQL Server代理作业不可用于SQL Server Express
  • 范围到数据库级别。 你可以很容易地将数据库移动到相关的任务中(特别是当你需要从一个环境转移到另一个环境时)
  • 查看/操作任务所需的权限较低(数据库级别)

build议的区别:

SQL Server代理(维护):

  • 备份
  • 索引/统计信息重build
  • 复制

任务计划程序(业务stream程):

  • 删除旧的数据
  • 预集合/循环重新计算
  • 非规范化

如何设置:

  • 从部分获取源代码:“Do pobrania” – 要下载(启用经纪人/设置架构tsks /configuration表+触发器+存储过程)/设置经纪人的东西)
  • 设置configuration表[tsks].[tsksx_task_scheduler]添加新的任务(列名是自描述,包括示例任务)

警告:博客是用波兰语写的,但是相关的源代码是英文的,并且很容易遵循。

警告2:在使用之前,请确保您已经在非生产环境中进行了testing。