SQL Server必须用SQL Server Agent、MySQL必须用EVENT Scheduler实现定时执行;Agent未启动或权限不足(如非sysadmin角色、Windows账户缺“作为服务登录”权限)、event_scheduler=OFF、作业步骤未指定数据库或用三段式名称、存储过程含NULL未兜底等,均会导致任务静默失败。

不能靠存储过程自己“定时”,必须依赖数据库外置或内置调度器——SQL Server 用 SQL Server Agent,MySQL 用 EVENT Scheduler。
SQL Server Agent 没启动,作业永远不会跑
很多人建完作业就以为万事大吉,结果发现 Job 'xxx' is not running because the SQL Server Agent service is not running。这不是配置问题,是服务根本没开。
- 在 Windows 服务管理器里找
SQL Server Agent (MSSQLSERVER)或带实例名的对应服务,必须手动启动 - Agent 运行账户需有足够权限:至少对目标数据库有
db_datareader和EXECUTE权限;若用 Windows 账户,还必须赋予“作为服务登录”权限 - 作业所有者账号需是
sysadmin角色,或至少被授予SQLAgentOperatorRole(在msdb库中)
MySQL 的 event_scheduler 默认是 OFF
执行 CREATE EVENT 成功 ≠ 事件会触发。如果 SHOW VARIABLES LIKE 'event_scheduler' 返回 OFF,那事件永远处于休眠状态。
- 临时启用:用管理员权限执行
SET GLOBAL event_scheduler = ON - 永久生效:在
my.cnf的[mysqld]段加event_scheduler=ON,然后重启 MySQL -
STARTS时间必须是未来时间,比如今天是 2026-07-02,就不能设STARTS '2026-07-01 00:00:00',否则状态变成SLAVESIDE_DISABLED - 事件名别和存储过程重名,否则
SHOW EVENTS看不到;建议统一加前缀,如evt_daily_report
作业步骤里不指定数据库,EXEC MyProc 必报错
Agent 默认在 master 数据库上下文执行命令,而你的存储过程大概率在业务库。直接写 EXEC Pr_daily_report 就会提示 Could not find stored procedure 'Pr_daily_report'。
- 稳妥做法:在作业步骤的“数据库”下拉框中手动选中目标库(比写
USE [YourDB]更可靠) - 三段式调用也行:
EXEC [YourDB].[dbo].[Pr_daily_report],但前提是库名、架构名、过程名都拼写准确 - 别在命令里拼接动态 SQL,尤其是含用户输入时——Agent 日志不记录实际执行语句,排障几乎无从下手
- 存储过程若有输出参数或返回值,Agent 不捕获也不展示,只能靠日志表或邮件通知验证结果
存储过程内部空值不处理,定时任务必崩
没人盯着控制台,但空数据每天都会来。比如 SELECT @total = SUM(amount) FROM orders WHERE order_date = CURDATE(),当天没订单,@total 就是 NULL,后续除零、插入非空字段、聚合比较全会出错。
- 所有聚合函数显式兜底:
COALESCE(SUM(amount), 0)替代裸SUM(amount) - 插入前防重复:
IF NOT EXISTS (SELECT 1 FROM daily_summary WHERE report_date = CURDATE()) - 关键步骤后加错误检查:
IF @@ERROR 0 BEGIN INSERT INTO error_log ... END - 避免用
NOW()做日期基准,临界点(如 23:59:59)可能跨日;改用CURDATE()或CAST(NOW() AS DATE)
真正容易被忽略的不是怎么配,而是“谁在什么时候以什么身份执行”——Agent 作业的运行上下文、EVENT 的默认数据库、存储过程里的事务边界,三者稍有错位,任务就静默失败。查日志别只看表面成功,得翻 msdb.dbo.sysjobhistory 或 information_schema.EVENTS 确认真实状态。

















