【问题标题】:Scheduled run of stored procedure on SQL server在 SQL Server 上按计划运行存储过程
【发布时间】:2010-09-22 04:06:54
【问题描述】:

是否可以通过某种方式设置 Microsoft SQL Server 以定期运行存储过程?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

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

    想法(简化):

    1. 编写一个存储过程/触发器,开始对话 (BEGIN DIALOG) 作为环回 (FROM my_service TO 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. 程序将执行特定代码并重新启动计时器以再次触发。


    您可以找到由 Michał Gołoś 编写的完整解决方案 (T-SQL),名为 Task Scheduler

    博客要点:

    优点:

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

    建议的区别:

    SQL Server 代理(维护):

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

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

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

    如何设置:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      或者甚至创建一个.bat 文件。因此,您甚至可以按需点击任务 2 次。

      这个HERE也已经接近了

      【讨论】:

        【解决方案3】:

        是的,在 MS SQL Server 中,您可以创建计划作业。在 SQL Management Studio 中,导航到服务器,然后展开 SQL Server Agent 项,最后展开 Jobs 文件夹以查看、编辑、添加计划作业。

        【讨论】:

        • 对我来说太奇怪了,这个答案在去年得到了比 2008 年至 2013 年更多的支持。为什么会这样?
        • 好吧,由于项目要求,我今天来到这里 - 瞧!再给你一票!
        【解决方案4】:

        如果正在使用 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
        

        一些注意事项:

        【讨论】:

        • 这是一个永无止境的过程,一个无限循环吗?这会在每天 '03:33:33' 执行吗?
        • 对重复间隔运行的任务使用以下命令(理想情况下添加检查以防止重叠,例如通过监视表位列 [IsRunning]):waitfor delay '00:05'
        【解决方案5】:

        我要补充一点:我所在的地方过去每天晚上都有一堆批处理作业。但是,我们正在从这种方式转移到使用在启动每个作业的 Windows 计划任务中计划的客户端应用程序。这有(至少)三个原因:

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

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

        【讨论】:

        • 不,我不需要代码,只需要大致的想法。非常感谢。 :)
        【解决方案6】:

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

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

        您可以在此处创建新作业,您将看到需要创建的步骤列表。创建新步骤时,可以指定实际运行存储过程的步骤(类型 TSQL 脚本)。选择数据库,然后在命令部分输入如下内容:

        exec MyStoredProcedure

        这就是概述,如果您需要任何进一步的建议,请在此处回复。

        [我实际上以为我可能会在这个项目中获得第一名,我错了:)]

        【讨论】:

          【解决方案7】:

          【讨论】:

            【解决方案8】:

            使用 Management Studio - 您可以创建作业(在 SQL Server 代理下) 一项工作可能包括几个步骤 从 T-SQL 脚本到 SSIS 包

            Jeb 更快 ;)

            【讨论】:

              猜你喜欢
              • 2020-10-16
              • 2016-11-27
              • 1970-01-01
              • 1970-01-01
              • 2011-11-11
              • 2016-10-21
              • 1970-01-01
              • 2020-02-24
              • 2016-04-28
              相关资源
              最近更新 更多