2010-06-18 85 views
2

我有一个维护计划,看起来像这样...Sql Server的维护计划任务和完成

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导入数据的“成功”部分不会启动,直到它成功完成!虽然日志似乎表明,但...

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

谢谢!

回答

0

对我来说,解决方案最终不是使用内置的“执行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 
0

尝试将一个序列容器放置在需要在组中执行的任务中。