计划在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有三个原因:
- 我们有一些控制台程序也需要每晚运行。 这样所有的计划任务可以在一个地方。 当然,这会造成一个单一的失败点,但是如果控制台作业不运行,我们将在第二天失去一天的工作。
- 启动作业的程序从服务器捕获打印消息和错误,并将它们写入到所有批处理过程的通用应用程序日志中。 它使从SQL工作日志logging更简单。
- 如果我们需要升级服务器(我们希望能很快做到这一点),我们不必担心移动工作。 只需重新指定应用程序一次。
这是一个真正的简短的VB.Net应用程序:如果任何人感兴趣,我可以发布代码。
使用Management Studio – 您可以创build一个作业(unter SQL Server代理)一个作业可能包括从T-SQL脚本到SSIS包的几个步骤
杰布速度更快;)
您应该查看使用SQL Server代理预定的作业 。
您可以使用SQL Server Service Broker来创build自定义机制。
想法(简化):
-
写一个存储过程/触发器开始对话( BEGIN DIALOG )作为回送(从my_service到my_service) – 获取对话处理程序
DECLARE @dialog UNIQUEIDENTIFIER; BEGIN DIALOG CONVERSATION @dialog FROM SERVICE [name] TO SERVICE 'name' ...;
-
启动会话计时器
DECLARE @time INT; BEGIN CONVERSATION TIMER (@dialog) TIMEOUT = @time;
-
在指定的秒数之后,消息将被发送到服务。 它将被列入关联的队列。
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)
-
过程将执行特定的代码和可重新启动的定时器再次触发。
您可以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。