【发布时间】:2010-09-22 04:06:54
【问题描述】:
是否可以通过某种方式设置 Microsoft SQL Server 以定期运行存储过程?
【问题讨论】:
标签: sql-server tsql
是否可以通过某种方式设置 Microsoft SQL Server 以定期运行存储过程?
【问题讨论】:
标签: sql-server tsql
您可以使用 SQL Server Service Broker 来创建自定义机制。
想法(简化):
编写一个存储过程/触发器,开始对话 (BEGIN DIALOG) 作为环回 (FROM my_service TO 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)
程序将执行特定代码并重新启动计时器以再次触发。
您可以找到由 Michał Gołoś 编写的完整解决方案 (T-SQL),名为 Task Scheduler
博客要点:
优点:
建议的区别:
SQL Server 代理(维护):
任务计划程序(业务流程):
如何设置:
[tsks].[tsksx_task_scheduler] 以添加新任务(列名是自描述的,包括示例任务)警告:博客是用波兰语写的,但相关的源代码是英文的,很容易理解。
警告2:使用前,请确保已在非生产环境中测试过。
【讨论】:
可能不是您正在寻找的答案,但我发现简单地使用Windows Server Task Scheduler 更有用
可以直接使用命令sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"
或者甚至创建一个.bat 文件。因此,您甚至可以按需点击任务 2 次。
这个HERE也已经接近了
【讨论】:
是的,在 MS SQL Server 中,您可以创建计划作业。在 SQL Management Studio 中,导航到服务器,然后展开 SQL Server Agent 项,最后展开 Jobs 文件夹以查看、编辑、添加计划作业。
【讨论】:
如果正在使用 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
一些注意事项:
【讨论】:
我要补充一点:我所在的地方过去每天晚上都有一堆批处理作业。但是,我们正在从这种方式转移到使用在启动每个作业的 Windows 计划任务中计划的客户端应用程序。这有(至少)三个原因:
这是一个真正的简短 VB.Net 应用程序:如果有人感兴趣,我可以发布代码。
【讨论】:
是的,如果您使用 SQL Server 代理。
打开您的企业管理器,然后转到您感兴趣的 SQL Server 实例下的管理文件夹。在那里您将看到 SQL Server 代理,在其下方您将看到一个作业部分。
您可以在此处创建新作业,您将看到需要创建的步骤列表。创建新步骤时,可以指定实际运行存储过程的步骤(类型 TSQL 脚本)。选择数据库,然后在命令部分输入如下内容:
exec MyStoredProcedure
这就是概述,如果您需要任何进一步的建议,请在此处回复。
[我实际上以为我可能会在这个项目中获得第一名,我错了:)]
【讨论】:
【讨论】:
使用 Management Studio - 您可以创建作业(在 SQL Server 代理下) 一项工作可能包括几个步骤 从 T-SQL 脚本到 SSIS 包
Jeb 更快 ;)
【讨论】: