SQL Agent Job恢复脚本报错:sp_verify_category_identifiers参数缺失
解决SQL Agent作业恢复时sp_verify_category_identifiers参数报错问题
核心问题分析
sp_verify_category_identifiers是MSDB库中的系统存储过程,用于验证作业分类的合法性,报错提示缺少@category_name通常是以下两种原因:
- 参数传递顺序错误,未按存储过程定义的顺序或显式指定参数名
- 当作业分类类型不为"无分类"时,未提供有效的分类名称
存储过程参数说明
该存储过程的4个参数定义及作用如下:
@job_id UNIQUEIDENTIFIER:要验证的作业唯一ID@category_type INT:作业分类类型,取值为:- 1:本地作业分类(LOCAL_JOB_CATEGORY)
- 2:多服务器作业分类(MULTI_SERVER_JOB_CATEGORY)
- 3:无分类(NONE)
@category_name SYSNAME = NULL:作业分类名称,当@category_type为1或2时必须提供有效值@category_id INT = NULL OUTPUT:输出参数,返回验证通过的分类ID
正确调用示例
结合你的JobAgentRestore备份表,恢复时按以下方式调用:
DECLARE @target_job_id UNIQUEIDENTIFIER DECLARE @target_category_type INT DECLARE @target_category_name SYSNAME DECLARE @validated_category_id INT -- 从备份表读取目标作业的分类信息 SELECT @target_job_id = job_id, @target_category_type = category_type, @target_category_name = category_name FROM JobAgentRestore WHERE job_name = '需要恢复的作业名称' -- 替换为实际作业名 -- 显式指定参数名调用存储过程,避免顺序错误 EXEC msdb.dbo.sp_verify_category_identifiers @job_id = @target_job_id, @category_type = @target_category_type, @category_name = @target_category_name, @category_id = @validated_category_id OUTPUT -- 后续可使用@validated_category_id关联作业分类完成恢复
关键注意事项
- 备份时确保分类信息完整:如果你的备份表未正确存储分类类型和名称,恢复时必然报错。修正备份脚本,确保从系统表获取完整分类数据:
-- 修正后的备份插入语句 INSERT INTO JobAgentRestore (job_id, job_name, category_type, category_name, ...其他字段...) SELECT j.job_id, j.name AS job_name, ISNULL(c.category_type, 3) AS category_type, -- 无分类时默认设为3 ISNULL(c.name, '') AS category_name, -- 其他需要备份的作业字段(如描述、所有者等) FROM msdb.dbo.sysjobs j LEFT JOIN msdb.dbo.syscategories c ON j.category_id = c.category_id
无分类作业的处理:如果作业没有分类,
@category_type设为3,此时@category_name可传NULL或空字符串,存储过程不会报错。避免位置参数调用:不要仅按位置传递参数,显式指定参数名可以避免因参数顺序混淆导致的错误。
内容的提问来源于stack exchange,提问作者randia
相关产品推荐
相关产品推荐

