sql - 从存储过程执行SQL Server代理作业并返回作业结果

标签 sql sql-server sql-server-2008 tsql jobs

需要有一个存储过程来调用 SQL Server 代理作业并返回作业是否成功运行。

到目前为止我已经

CREATE PROCEDURE MonthlyData
AS
EXEC msdb.dbo.sp_start_job N'MonthlyData'

WAITFOR DELAY '000:04:00'

EXEC msdb.dbo.sp_help_jobhistory @job_name = 'MonthlyData'
GO

哪个启 Action 业,如果作业运行成功或失败,返回的最佳方式是什么?

好的,进行了编辑并使用了 WAITFOR DELAY,因为该作业通常运行 3-4 分钟,但绝不会超过 4 分钟。该作业是否可以完成,但有更有效的方法吗?

最佳答案

对于所有不允许使用OPENROWSET命令的人来说,这可能会有所帮助。我在这里找到了解决方案的起点:

http://social.msdn.microsoft.com/Forums/en-US/89659729-fea8-4df0-8057-79e0a437b658/dynamically-checking-job-status-with-tsql

这依赖于这样一个事实:msdb.dbo.sysjobactivity 表的某些列在作业以某种方式完成后首先被填充。

-- Start job
DECLARE @job_name NVARCHAR(MAX) = 'JobName'
EXEC msdb.dbo.sp_start_job @job_name = @job_name


-- Wait for job to finish
DECLARE @job_history_id AS INT = NULL

WHILE @time_constraint = @ok
BEGIN
    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

    IF @job_history_id IS NULL
    BEGIN
        WAITFOR DELAY '00:00:10'
        CONTINUE
    END
    ELSE
        BREAK
END


-- Check exit code
SELECT history.run_status
FROM msdb.dbo.sysjobhistory history
WHERE history.instance_id = @job_history_id

您可能需要检查 WHILE 循环允许运行的时间。我选择将该部分保留在示例之外。

Microsoft 有关退出代码等的指南: http://technet.microsoft.com/en-us/library/ms174997.aspx

关于sql - 从存储过程执行SQL Server代理作业并返回作业结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249056/

相关文章:

c# - 在 C#/VB.NET 中解码 T-SQL CAST

sql - LOG 和 EXP 函数中的舍入问题

sql-server - 检查具有多个输入参数的约束 UDF 不起作用

sql-server - SQL Server VARBINARY INSERT 锁定表 30 分钟以上

sql - 从序列sql中获取下一个值

sql - 在WHERE中使用Oracle内置UPPER函数会导致SELECT语句的性能下降吗?

c# - 如何在sql语句结果的末尾插入文本?

c# - Entity Framework 批量插入/更新关系

sql - 查找顺序值的有效方法

mysql - SQL ORDER BY 可与自定义 "comparators"配合使用吗?