最近在维护一套老系统时翻出一段还在稳定运行的 SQL Server 作业任务代码,功能是定时统计房间玩家的胜负情况,用于构建游戏数据中心里的输赢记录表。这类脚本在很多棋牌类、竞技类或匹配类服务器中都很常见,尤其是用到网狐框架的项目。
本篇文章就来详细讲讲这个统计任务的脚本结构,包括作业创建、任务步骤定义、调度计划安排、调用存储过程等逻辑,非常适合对 sql Agent 有实战需求的同学参考。
一、这个脚本主要解决什么问题?
在实际棋牌项目或竞技平台中,每天都有成千上万条对局数据产生。为了后续能够在排行榜、数据面板、用户分析等功能中使用这些输赢数据,就需要定时对战绩数据做整理和归档。
这段脚本的目的就是通过 SQL Server 的 Agent 定时任务机制,去定时调用一个统计存储过程,把指定房间的对局记录转为用户胜负统计表结构,这样后续开发使用就方便得多了。
二、脚本内容结构简介
本脚本是一个典型的 SQL Server Agent 任务定义脚本,执行流程分为以下几个核心步骤:
-
创建作业分类(Job Category)
-
注册作业(Job)
-
添加作业步骤(执行统计过程)
-
设置调度规则(每天执行一次)
-
绑定执行服务器(本地)
每一步都封装在事务中,异常即回滚,逻辑严谨、结构清晰。
三、关键部分拆解说明
✅ 1. Job 分类定义(JobCategory)
这部分代码的作用是确保脚本运行时,有一个名为 [Uncategorized (Local)]
的默认作业分类可用。
IF NOT EXISTS (
SELECT name FROM msdb.dbo.syscategories
WHERE name=N'[Uncategorized (Local)]' AND category_class=1
)
BEGIN
EXEC msdb.dbo.sp_add_category
@class=N'JOB',
@type=N'LOCAL',
@name=N'[Uncategorized (Local)]'
END
如果分类不存在,它就会自动创建,方便后续作业归类管理。
✅ 2. 创建作业(Add Job)
接着我们通过 sp_add_job
注册一个名为 胜负计数统计
的任务,同时指定执行权限和所属分类。
EXEC sp_add_job
@job_name=N'胜负计数统计',
@enabled=1,
@description=N'定时统计玩家房间胜负数据',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'kawu789sfk',
@job_id=@jobId OUTPUT
作业名称可以自定义,但要确保在系统中唯一。
✅ 3. 添加作业步骤:调用统计存储过程
这一步是任务的核心,即设定作业要执行什么内容。在这个例子中,它调用的是如下过程:
exec RYTreasureDB.dbo.GSP_GR_RoomWinRateToUserRecord 2
这是一个自定义存储过程,用来将房间 ID 为 2 的数据整理成用户维度的胜负记录表。
EXEC sp_add_jobstep
@job_id=@jobId,
@step_name=N'胜负技术统计',
@subsystem=N'TSQL',
@command=N'exec RYTreasureDB.dbo.GSP_GR_RoomWinRateToUserRecord 2',
@database_name=N'RYTreasureDB'
✅ 4. 设置调度时间:每天执行一次
脚本中设定这个任务为每天运行一次,起始日期为 2019年2月15日
,结束时间设置为远未来(9999年),保障长期运行:
EXEC sp_add_jobschedule
@job_id=@jobId,
@name=N'胜负统计',
@freq_type=4, -- 每天
@active_start_date=20190215,
@active_end_date=99991231,
@active_start_time=000000,
@active_end_time=235959
你可以根据实际需求调整执行频率,例如每小时、每分钟等。
✅ 5. 绑定服务器(Add JobServer)
最后一步将作业绑定到服务器本地,使其可以在部署后自动运行:
EXEC sp_add_jobserver
@job_id = @jobId,
@server_name = N'(local)'
绑定成功后,SQL Server Agent 会根据调度规则定时触发作业执行。