代码之家  ›  专栏  ›  技术社区  ›  Bennett Dill

SQL Server维护计划任务和完成

  •  2
  • Bennett Dill  · 技术社区  · 14 年前

    我有一个维修计划,看起来像这样…

    Client 1 Import Data (Success) -> Process Data (Success) -> Post Process (Completion) -> Next Client
    Client 2 Import Data (Success) -> Process Data (Success) -> Post Process (Completion) -> Next Client
    Client N ...
    

    导入数据和进程数据正在调用作业,后处理是一个执行SQL任务。 如果导入数据或进程数据失败,它将转到下一个客户端导入数据…

    导入数据和进程数据都是包含使用内置SQL日志记录提供程序的SSIS包的作业。

    我对现有配置的期望是:

    1. 客户端1导入数据运行:失败->客户端2导入数据成功处理数据
    2. 进程数据运行:失败->客户端2导入数据成功发布进程
    3. 后期处理运行:完成->成功或失败->下一个客户端导入数据

    但这不是我在日志中看到的… 我看到几个客户机导入数据SSIS日志条目,然后是几个后处理日志条目,然后返回到客户机导入数据!啊!!

    我做错什么了?我不认为客户端1导入数据的“成功”部分会启动,直到它…好。。。成功,又名完成!不过,日志上似乎另有说明…

    我真的需要这些任务是连续的而不是并发的。这有可能吗?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  0
  •   Sam    14 年前

    尝试在需要分组执行的任务周围放置序列容器。

        2
  •  0
  •   Bennett Dill    14 年前

    对于我来说,解决方法最终不是使用内置的“执行SQL Server代理作业任务”,而是使用“执行T-SQL语句任务”,并调用一个在完成前被阻止的存储过程…

    甜蜜的成功:—)

    CREATE PROCEDURE [dbo].[SQLJob_RunBlocking]
    (
        @JobName SYSNAME
    )
    AS
    BEGIN
        -- running a job returns before the job is complete
        -- this procedure will run the job and loop until its status is complete
        SET NOCOUNT ON;
    
        DECLARE @JobStatus INT;
    
        -- start job
        EXECUTE msdb.dbo.sp_start_job @job_name = @JobName;
    
        -- loop until status is complete
        WHILE ISNULL(@JobStatus, 0) != 4 BEGIN
            WAITFOR DELAY '00:00:01';
    
            EXECUTE dbo.SQLJob_GetStatus @job_name = @JobName, @select_data = 0, @execution_status = @JobStatus OUTPUT;
        END
    END
    

    还有…

    CREATE PROCEDURE [dbo].[SQLJob_GetStatus]
    (
        @job_name SYSNAME
        ,@select_data INT = 0
        ,@execution_status INT = NULL OUTPUT
    )
    AS
    BEGIN
        SET NOCOUNT ON;
    
        -- http://www.siccolo.com/Articles/SQLScripts/how-to-create-sql-to-sql-job-execution-status.html
        /*
            Is the execution status for the jobs. 
            Value Description 
            0 Returns only those jobs that are not idle or suspended.  
            1 Executing. 
            2 Waiting for thread. 
            3 Between retries. 
            4 Idle. 
            5 Suspended. 
            7 Performing completion actions 
        */
    
        DECLARE @job_id UNIQUEIDENTIFIER 
            ,@is_sysadmin INT
            ,@job_owner SYSNAME;
    
        SELECT @job_id = job_id FROM msdb.dbo.sysjobs_view where name = @job_name;
        SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0);
        SELECT @job_owner = SUSER_SNAME();
    
        CREATE TABLE #xp_results (
            job_id                UNIQUEIDENTIFIER NOT NULL,
            last_run_date         INT              NOT NULL,
            last_run_time         INT              NOT NULL,
            next_run_date         INT              NOT NULL,
            next_run_time         INT              NOT NULL,
            next_run_schedule_id  INT              NOT NULL,
            requested_to_run      INT              NOT NULL, -- BOOL
            request_source        INT              NOT NULL,
            request_source_id     sysname          COLLATE database_default NULL,
            running               INT              NOT NULL, -- BOOL
            current_step          INT              NOT NULL,
            current_retry_attempt INT              NOT NULL,
            job_state             INT              NOT NULL
        );
    
    
        IF ((@@microsoftversion / 0x01000000) >= 8) -- SQL Server 8.0 or greater
            INSERT INTO #xp_results
            EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner, @job_id;
        ELSE
            INSERT INTO #xp_results
            EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner;
    
        --declare @execution_status int
        SET @execution_status = (SELECT job_state FROM #xp_results);
    
        DROP TABLE #xp_results;
    
        IF @select_data = 1 
            SELECT @job_name AS 'job_name', @execution_status AS 'execution_status';
    END