我该如何安排一个任务每天运行一次SQL查询?

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

1
这里是 Express 版本的解决方案:https://dev59.com/9Gw05IYBdhLWcg3wfx80#7201189 - HasanG
6个回答

190
  1. 展开 SQL Server 代理节点,在 SQL Server 代理中右键单击 Jobs 节点,然后选择 'New Job'

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

  3. 在窗口左侧选择 'Steps',然后在底部单击 'New'

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

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

  6. 单击 New Job 窗口左侧的 'Schedule' 菜单,并输入计划信息(例如每天和时间)。

  7. 单击 'OK' - 就这样。

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


如何在SQL Server Express上实现这个?SQL Server Express是否带有代理和高级服务? - Bilal Fazlani
7
毫无疑问,取决于您登录的身份,您可能根本无法看到SQL Server代理节点... 并非每个人都以sa身份登录。更多(相当枯燥)信息,请参见此处:http://msdn.microsoft.com/en-us/library/ms188283.aspx - Fetchez la vache
如果 SQL Server Agent 节点没有可展开的标签“Agent XPs disabled”,请运行以下代码:sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Agent XPs', 1; GO RECONFIGURE GO 说明请参见此链接:https://msdn.microsoft.com/zh-cn/library/ms178127.aspx - Baz Guvenkaya
4
也许可以使用批处理(BAT)、命令提示符(CMD)或PowerShell脚本进行编程实现。 - Kiquenet

168

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

计划SQL作业


1
必须使用sa登录吗?我没有用sa登录,也没有看到SQL Server代理。我认为我没有足够的权限来查看它。 - Alper
2
为了在菜单树中查看 SQL Server Agent 区域,您登录的用户需要在 MSDB 数据库上拥有正确的权限(MSDB 是 SSMS 用于诸如权限之类的事物的内置数据库)。从主树浏览器中,进入“安全性” > “登录” > “your-username” > 右键单击 > “属性” > “用户映射” > 选择“msdb” > 然后勾选下方的“SQLAgentOperatorRole”。 - S.Mason

24
要在T-SQL中实现这个功能,你可以使用以下系统存储过程来安排每天的作业。例如,将作业安排在每天凌晨1点执行。有关各个存储过程的语法和参数有效范围的详细信息,请参阅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

12

使用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 ;

1

如果您想要每日备份 // 以下 SQL 脚本存储在 C:\Users\admin\Desktop\DBScript\DBBackUpSQL.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

打开任务计划程序
创建任务->选择“触发器”选项卡->选择“新建”。
按钮选择每日单选按钮。
点击“确定”按钮。
然后点击“操作”选项卡,选择“新建”。
按钮在程序/脚本文本框中放置“C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE”-S ADMIN-PC -i “C:\Users\admin\Desktop\DBScript\DBBackUpSQL.sql”(确保匹配您的文件路径,并将双引号路径放在开始->搜索框中,如果找到则单击它并查看备份是否存在)。
--上述路径可能是90而不是100,如下所示:“C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE”-S ADMIN-PC -i “C:\Users\admin\Desktop\DBScript\DBBackUpSQL.sql”
然后点击“确定”按钮。
脚本将根据您在触发器选项卡上选择的时间定期执行。
享受它.............

-3
这是一个示例代码:
Exec sp_add_schedule
    @schedule_name = N'SchedulName' 
    @freq_type = 1
    @active_start_time = 08300

23
在你的回答中加入代码解释通常是一个好主意(即使对你来说显而易见)。 - Nathan Hughes
1
这个答案没有足够的解释。没有足够的解释,读者无法理解这个答案。 - Jino Shaji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接