【发布时间】:2020-06-15 17:33:38
【问题描述】:
基本上我需要创建一个shell脚本来:
- 在远程服务器上运行 SQL 代理作业
- 等待它运行
- 检查完成状态并能够保存/输出它以便进一步使用
我计划的方式是使用这样的作业名称参数创建一个存储过程:
-- Start job
EXEC msdb.dbo.sp_start_job @job_name = @job_name
-- Wait for Job to finish
DECLARE @job_status INT
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=<server>;','exec msdb.dbo.sp_help_job @job_name = @job_name ')
WHILE @job_status <> 4
BEGIN
WAITFOR DELAY '00:00:03'
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=<server>;','exec msdb.dbo.sp_help_job @job_name = @job_name')
END
-- Get Result
SELECT TOP 1 @job_history_id = activity.job_history_id
FROM msdb.dbo.sysjobs jobs
INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
WHERE jobs.name = @job_name
ORDER BY activity.start_execution_date DESC
SELECT history.run_status
FROM msdb.dbo.sysjobhistory history
WHERE history.instance_id = @job_history_id
理想情况下,我可以通过此 stored_proc 运行每个 SQL 代理作业,因此我可以通过 sqlcmd 将作业名称作为参数非常轻松地调用此 stored_proc,并将输出保存为作业的结果。
由于我对 SQL Server 不是最有经验,所以我向大家寻求帮助。
- 我的存储过程效率/功能是否有效?谁能启发我更好的方法?
- 是否应在 msdb 数据库上创建此存储过程,如果是,是否应将其保存为系统对象?
- 这是否会发布迁移或任何管理问题(即迁移 SQL 版本/到不同服务器以保留此存储过程的特殊操作)?
提前感谢您的支持。
【问题讨论】:
-
运行一个循环来检查某事何时完成不是最好的主意,但可以使用。你想在这里实现什么,即工作完成后会发生什么?
-
此作业将恢复部分数据库,运行成功后将触发测试
-
为什么不添加测试作为额外的工作步骤?
-
分离真的,测试是使用定制的框架运行的,因此,它们将由 CI Server 管理,而不是由 SQL Server 管理。这里的主要想法是能够等待恢复作业并检查它是否成功
标签: sql-server stored-procedures sqlcmd sql-job