【问题标题】:Sql Server Maintenance Plan Tasks & CompletionSql Server 维护计划任务和完成
【发布时间】:2010-06-18 04:39:48
【问题描述】:

我有一个看起来像这样的维护计划...

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 ...

Import Data 和 Process Data 正在调用作业,而 Post Process 是一个 Execute Sql 任务。 如果 Import Data 或 Process Data Fail,则转到下一个客户端 Import Data...

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

我对当前配置的期望是:

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

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

我做错了什么?我不认为客户端 1 导入数据的“成功”部分会开始,直到它......好吧......成功又完成了!日志似乎表明并非如此......

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

谢谢!

【问题讨论】:

    标签: sql-server concurrency ssis maintenance-plan


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多