创建带调度的SQL Server Agent Job:调度设置与本地执行报错求助
解决SQL Server Agent Job创建的两个问题
问题1:设置任务每月第一个周一执行
要实现每月第一个周一运行,需调整JobSchedule的核心属性:
- 将
FrequencyTypes从Daily改为Monthly - 设置
FrequencyRelativeInterval为First(指定每月的第一个目标工作日) - 设置
FrequencyInterval为1(对应周一,SMO中工作日枚举规则:1=周一,2=周二……7=周日) - 保持
FrequencyRecurrenceFactor为1(每月执行一次)
问题2:解决"必须指定目标服务器"错误
报错根源是调用了AddSharedSchedule,这会将作业标记为多服务器共享作业,但你仅需本地执行。解决方法:
- 删除
$SQLJob.AddSharedSchedule($SQLJobSchedule.ID)代码行 - 你创建的
JobSchedule已通过构造函数关联到当前Job,属于该Job的专属调度,无需添加共享调度
修改后的完整脚本
$ServerList = Get-Content F:\Logs\ListOfServers.txt # 请确保$Command已提前定义,例如:$Command = "你的SQL执行命令" foreach ($srv in $ServerList) { $SQLSvr = New-Object -TypeName Microsoft.SQLServer.Management.Smo.Server($srv) # 检查并删除已存在的启用状态的目标Job if ((Get-SQLAgentJob -ServerInstance $srv).Where{$_.Name -eq 'Delete_Users' -and $_.IsEnabled -eq $true}) { Remove-DbaAgentJob -SqlInstance $srv -Job 'Delete_Users' -Confirm:$false } # 创建本地Job(默认创建为本地作业,无需额外配置) $SQLJob = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Agent.Job -ArgumentList $SQLSvr.JobServer, "Delete_Users" $SQLJob.Create() # 创建Job执行步骤 $SQLJobStep = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Agent.JobStep -ArgumentList $SQLJob, "Step1_Delete_Users" $SQLJobStep.Command = $Command $SQLJobStep.DatabaseName = "master" $SQLJobStep.Create() # 创建每月第一个周一15:10执行的调度 $SQLJobSchedule = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Agent.JobSchedule -ArgumentList $SQLJob, "Delete_Users_Scheduler" $SQLJobSchedule.FrequencyTypes = "Monthly" $SQLJobSchedule.FrequencyRelativeInterval = [Microsoft.SqlServer.Management.Smo.Agent.FrequencyRelativeInterval]::First $SQLJobSchedule.FrequencyInterval = 1 # 对应周一 $SQLJobSchedule.FrequencyRecurrenceFactor = 1 # 每月执行一次 $TimeSpan1 = New-TimeSpan -Hours 15 -Minutes 10 $SQLJobSchedule.ActiveStartTimeOfDay = $TimeSpan1 $SQLJobSchedule.ActiveStartDate = Get-Date $SQLJobSchedule.Create() # 移除共享调度关联代码,无需此操作 # $SQLJob.AddSharedSchedule($SQLJobSchedule.ID) $SQLJob.Alter() }
额外注意事项
- 确保运行脚本的环境已加载SQL Server SMO相关程序集,避免出现类型找不到的错误
- 若直接使用字符串设置
FrequencyRelativeInterval报错,改用枚举值[Microsoft.SqlServer.Management.Smo.Agent.FrequencyRelativeInterval]::First更稳定 - 执行脚本的账号需具备创建SQL Server Agent Job的权限
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

