如何安排作业以每天运行 SQL 查询?

Posted

技术标签:

【中文标题】如何安排作业以每天运行 SQL 查询?【英文标题】:How can I schedule a job to run a SQL query daily? 【发布时间】:2011-07-25 04:08:36 【问题描述】:

我需要知道如何使用 SQL Server 代理作业每天运行 SQL 查询,并且需要最少的配置设置。

【问题讨论】:

这里是速成版的解决方案:***.com/a/7201189/259881 【参考方案1】:

    展开SQL Server Agent节点,右键点击SQL Server Agent中的Jobs节点,选择'New Job'

    'New Job' 窗口中,在'General' 选项卡上输入作业名称和描述。

    选择窗口左侧的'Steps',然后点击底部的'New'

    'Steps' 窗口中输入步骤名称并选择要运行查询的数据库。

    将要运行的 T-SQL 命令粘贴到命令窗口中,然后单击 'OK'

    单击“新建作业”窗口左侧的'Schedule' 菜单并输入计划信息(例如每天和某个时间)。

    点击'OK' - 应该就是这样。

(您当然可以添加其他选项 - 但我想说这是您设置和安排工作所需的最低限度)

【讨论】:

如何在 sql server express 上做到这一点?代理是否带有带有高级服务的 sql server express?' 不言而喻,根据您登录的身份,您可能根本看不到 SQL Server 代理节点...不是每个人都以 sa 身份登录。更多(相当枯燥的)信息在这里..msdn.microsoft.com/en-us/library/ms188283.aspx 如果 SQL Server 代理节点不可扩展并带有标签“代理 XP 已禁用”,则运行此代码 sp_configure 'show advanced options', 1;去重新配置; GO sp_configure 'Agent XPs', 1; GO RECONFIGURE GO 解释在这个链接下:msdn.microsoft.com/en-us/library/ms178127.aspx 也许使用脚本 BAT、CMD、Powershell 来实现 以编程方式【参考方案2】:

我制作了已接受答案中步骤的动画 GIF。这是来自 MSSQL Server 2012

【讨论】:

一定要sa登录吗?我没有使用 sa 登录,也没有看到 sql server 代理。我认为我没有足够的权利看到它。 要在菜单树中查看 SQL Server 代理区域,您登录的用户需要对 MSDB 数据库具有正确的权限(MSDB 是 SSMS 用于诸如权限之类的内置数据库)。从主树浏览器转到 Security > Logins > your-username > right click > properties > user mappings > check msdb > 然后在下面检查 SQLAgentOperatorRole【参考方案3】:

要在 t-sql 中执行此操作,您可以使用以下系统存储过程来安排每日作业。此示例在每天凌晨 1:00 安排。有关各个存储过程的语法和有效参数范围的详细信息,请参阅 Microsoft 帮助。

DECLARE @job_name NVARCHAR(128), @description NVARCHAR(512), @owner_login_name NVARCHAR(128), @database_name NVARCHAR(128);

SET @job_name = N'Some Title';
SET @description = N'Periodically do something';
SET @owner_login_name = N'login';
SET @database_name = N'Database_Name';

-- Delete job if it already exists:
IF EXISTS(SELECT job_id FROM msdb.dbo.sysjobs WHERE (name = @job_name))
BEGIN
    EXEC msdb.dbo.sp_delete_job
        @job_name = @job_name;
END

-- Create the job:
EXEC  msdb.dbo.sp_add_job
    @job_name=@job_name, 
    @enabled=1, 
    @notify_level_eventlog=0, 
    @notify_level_email=2, 
    @notify_level_netsend=2, 
    @notify_level_page=2, 
    @delete_level=0, 
    @description=@description, 
    @category_name=N'[Uncategorized (Local)]', 
    @owner_login_name=@owner_login_name;

-- Add server:
EXEC msdb.dbo.sp_add_jobserver @job_name=@job_name;

-- Add step to execute SQL:
EXEC msdb.dbo.sp_add_jobstep
    @job_name=@job_name,
    @step_name=N'Execute SQL', 
    @step_id=1, 
    @cmdexec_success_code=0, 
    @on_success_action=1, 
    @on_fail_action=2, 
    @retry_attempts=0, 
    @retry_interval=0, 
    @os_run_priority=0, 
    @subsystem=N'TSQL', 
    @command=N'EXEC my_stored_procedure; -- OR ANY SQL STATEMENT', 
    @database_name=@database_name, 
    @flags=0;

-- Update job to set start step:
EXEC msdb.dbo.sp_update_job
    @job_name=@job_name, 
    @enabled=1, 
    @start_step_id=1, 
    @notify_level_eventlog=0, 
    @notify_level_email=2, 
    @notify_level_netsend=2, 
    @notify_level_page=2, 
    @delete_level=0, 
    @description=@description, 
    @category_name=N'[Uncategorized (Local)]', 
    @owner_login_name=@owner_login_name, 
    @notify_email_operator_name=N'', 
    @notify_netsend_operator_name=N'', 
    @notify_page_operator_name=N'';

-- Schedule job:
EXEC msdb.dbo.sp_add_jobschedule
    @job_name=@job_name,
    @name=N'Daily',
    @enabled=1,
    @freq_type=4,
    @freq_interval=1, 
    @freq_subday_type=1, 
    @freq_subday_interval=0, 
    @freq_relative_interval=0, 
    @freq_recurrence_factor=1, 
    @active_start_date=20170101, --YYYYMMDD
    @active_end_date=99991231, --YYYYMMDD (this represents no end date)
    @active_start_time=010000, --HHMMSS
    @active_end_time=235959; --HHMMSS

【讨论】:

【参考方案4】:

使用 T-SQL: 我的工作是执行存储过程。您可以轻松更改@command 来运行您的sql。

EXEC msdb.dbo.sp_add_job  
   @job_name = N'MakeDailyJob',   
   @enabled = 1,   
   @description = N'Procedure execution every day' ; 

 EXEC msdb.dbo.sp_add_jobstep  
    @job_name = N'MakeDailyJob',   
    @step_name = N'Run Procedure',   
    @subsystem = N'TSQL',   
    @command = 'exec BackupFromConfig';

 EXEC msdb.dbo.sp_add_schedule  
    @schedule_name = N'Everyday schedule',   
    @freq_type = 4,  -- daily start
    @freq_interval = 1,
    @active_start_time = '230000' ;   -- start time 23:00:00

 EXEC msdb.dbo.sp_attach_schedule  
   @job_name = N'MakeDailyJob',  
   @schedule_name = N'Everyday schedule' ;

 EXEC msdb.dbo.sp_add_jobserver  
   @job_name = N'MakeDailyJob',  
   @server_name = @@servername ;

【讨论】:

【参考方案5】:

如果您想要每日备份 // 遵循存储在 C:\Users\admin\Desktop\DBScript\DBBackUpSQL.sql 中的 sql 脚本

DECLARE @pathName NVARCHAR(512),
 @databaseName NVARCHAR(512) SET @databaseName = 'Databasename' SET @pathName = 'C:\DBBackup\DBData\DBBackUp' + Convert(varchar(8), GETDATE(), 112) + '_' + Replace((Convert(varchar(8), GETDATE(), 108)),':','-')+ '.bak' BACKUP DATABASE @databaseName TO DISK = @pathName WITH NOFORMAT, 
INIT, 
NAME = N'', 
SKIP, 
NOREWIND, 
NOUNLOAD, 
STATS = 10 
GO

打开任务调度器

创建任务-> 选择Triggers 选项卡选择New

按钮选择每日单选按钮

点击Ok按钮

然后点击Action选项卡选择新建。

Button Put "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S ADMIN-PC -i "C:\Users\admin\Desktop\DBScript\DBBackUpSQL.sql" 在程序/脚本文本框中(确保匹配您的文件路径并将双引号路径放在开始 - >搜索框中,如果找到然后单击它并查看备份是否存在)

-- 上面的路径可能是 100 写 90 "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -S ADMIN-PC -i "C:\Users\admin\Desktop\DBScript\DBBackUpSQL.sql"

然后点击确定按钮

脚本将每天按您在触发选项卡上选择的时间执行

好好享受吧……

【讨论】:

【参考方案6】:

这是一个示例代码:

Exec sp_add_schedule
    @schedule_name = N'SchedulName' 
    @freq_type = 1
    @active_start_time = 08300

【讨论】:

在答案中添加对代码的解释通常是个好主意(即使对您来说很明显)。 这个答案没有包含足够的解释。没有足够的解释,读者无法理解这个答案。

以上是关于如何安排作业以每天运行 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Developer 中安排作业

sql 计算生日 - 使用“EXEC UpdateBirthDays”创建sql作业并每天安排它。

SQL 代理作业关闭 Excel 过程

安排任务在两个日期之间每天运行两次

如何安排python代码每天运行?

如何使用 SQL Server Express 安排每日备份? [复制]