在SQL Server上预定运行存储过程

Ale*_*yev 60 t-sql sql-server

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

Jeb*_*Jeb 99

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

  • 对我来说很奇怪,这个答案在去年比2008年至2013年期间得到了更多的赞成.为什么会这样? (2认同)

Tho*_*att 39

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

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
Run Code Online (Sandbox Code Playgroud)

一些说明:


Cia*_*her 18

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

打开企业管理器,转到您感兴趣的SQL Server实例下的Management文件夹.在那里您将看到SQL Server代理,在其下方您将看到"作业"部分.

在这里,您可以创建一个新工作,您将看到需要创建的步骤列表.创建新步骤时,可以指定实际运行存储过程的步骤(键入TSQL脚本).选择数据库,然后为命令部分输入如下内容:

exec MyStoredProcedure
Run Code Online (Sandbox Code Playgroud)

这是概述,如果您需要任何进一步的建议,请回到此处.

[我实际上以为我可能会先进入这个,男孩我错了:)]


per*_*bus 8

可能不是您正在寻找的答案,但我发现仅使用Windows Server任务计划程序更有用

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

甚至创建一个.bat文件.所以你甚至可以按需点击2次任务.

这也是在这里找到的


Joe*_*orn 6

我将添加一件事:我在那里,我们曾经有过一堆每天晚上都要运行的批处理作业.但是,我们正在逐渐远离使用在Windows计划任务中安排的客户端应用程序,这些任务将启动每项工作.至少有三个原因:

  1. 我们有一些控制台程序也需要每晚运行.这样,所有计划任务都可以在一个地方.当然,这会造成单点故障,但如果控制台工作没有运行,我们无论如何都会在第二天失去一天的工作.
  2. 启动作业的程序从服务器捕获打印消息和错误,并将它们写入我们所有批处理过程的公共应用程序日志中.它使得使用sql作业进行日志记录变得更加简单.
  3. 如果我们需要升级服务器(我们希望尽快这样做),我们不需要担心将工作转移.只需重新指出应用程序一次.

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


Luk*_*zda 5

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

想法(简化):

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

    DECLARE @dialog UNIQUEIDENTIFIER;
    
    BEGIN DIALOG CONVERSATION @dialog
            FROM SERVICE   [name] 
            TO SERVICE      'name' 
            ...;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启动对话计时器

    DECLARE @time INT;
    BEGIN CONVERSATION TIMER (@dialog)  TIMEOUT = @time;
    
    Run Code Online (Sandbox Code Playgroud)
  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) 
    
    Run Code Online (Sandbox Code Playgroud)
  4. 程序将执行特定代码并重新启动计时器以再次触发。


你能找到Micha写的完全成熟的解决方案(T-SQL)吗?粘性物?称为任务计划程序

博客的要点:

优点:

  • 每个版本都支持(从 Express 到 Enterprise)。SQL Server 代理作业不适用于 SQL Server Express
  • 范围到数据库级别。您可以轻松地移动带有相关任务的数据库(尤其是当您必须将大约 100 个作业从一个环境移动到另一个环境时)
  • 查看/操作任务所需的较低权限(数据库级别)

建议区分:

SQL Server 代理(维护):

  • 备份
  • 索引/统计重建
  • 复制

任务调度器(业务流程):

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

如何设置:

  • 从部分获取源代码:“Do pobrania” - 下载(启用代理/设置架构 tsk/配置表 + 触发器 + 存储过程)/设置代理内容)
  • 设置配置表[tsks].[tsksx_task_scheduler]以添加新任务(列名称是自描述的,包括示例任务)

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

警告2:使用前请确保已在非生产环境中测试过。