Sql server SQL查询以查找正在运行的查询和作业

Sql server SQL查询以查找正在运行的查询和作业,sql-server,etl,Sql Server,Etl,我对SQL相当陌生。 我正在使用SQLServer2008 我想要的是一个查询,我可以将它放入ETL作业的计划中,强制它等待,直到运行给定作业的服务器空闲(就无作业或查询运行而言) 我已经写了一份声明,想知道是否有人能就我的查询的有效性给我一些意见。不过,我已经测试过了,它似乎有效 所以我得到了这张表: declare @retcode INT DECLARE @JobStatus INT DECLARE @QueryStatus INT SET @JobStatus = -1 SET @Qu

我对SQL相当陌生。 我正在使用SQLServer2008

我想要的是一个查询,我可以将它放入ETL作业的计划中,强制它等待,直到运行给定作业的服务器空闲(就无作业或查询运行而言)

我已经写了一份声明,想知道是否有人能就我的查询的有效性给我一些意见。不过,我已经测试过了,它似乎有效

所以我得到了这张表:

declare @retcode INT
DECLARE @JobStatus INT
DECLARE @QueryStatus INT

SET @JobStatus = -1
SET @QueryStatus = -1 

WHILE (@JobStatus != 0 AND @QueryStatus != 1)
BEGIN 

    -- Count all running jobs
        SELECT @JobStatus = count(*)
        FROM
        (
            SELECT sj.name
            ,DATEDIFF(SECOND,aj.start_execution_date,GetDate()) AS Seconds
            FROM msdb..sysjobactivity aj
            JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
            WHERE aj.stop_execution_date IS NULL -- job hasn't stopped running
            AND aj.start_execution_date IS NOT NULL -- job is currently running
            --AND sj.name = 'JobName'
            and not exists( -- make sure this is the most recent run
            select 1
            from msdb..sysjobactivity new
            where new.job_id = aj.job_id
            and new.start_execution_date > aj.start_execution_date )
        ) AS A;


    --only if other jobs are running
    IF (@JobStatus = 0)
        BEGIN
        -- Get QueryStatus zähl alle laufenden Queries die eigene Abfrage wird auch gezählt deswegen oben !=1
            SELECT @QueryStatus = count(*)
            FROM
            (
            SELECT sqltext.TEXT,
            req.session_id,
            req.status,
            req.command,
            req.cpu_time,
            req.total_elapsed_time
            FROM sys.dm_exec_requests req
            CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
            WHERE req.status NOT IN ('background','sleeping','suspended')
            ) AS B;

        END
    WAITFOR DELAY '00:00:02'
END
    -- output = 1 when there are no jobs or queries running
RETURN(1)