子程序包失败时的SSIS将FULL错误传递给父程序包

时间:2016-09-15 18:32:45

标签: ssis parent-child

我有一个调用子包的父包。如果子包失败,则会显示子包的完整错误详细信息,但父包只显示“任务执行包失败”。

如何让父包从子包中获取完整的错误消息,以便我可以正确地获取父包中的完整错误详细信息?

2 个答案:

答案 0 :(得分:0)

一种方法是让子包用错误消息填充变量,然后在父的OnError(或OnPostExecute)处理程序中读取该变量。

答案 1 :(得分:0)

解决方案:

如何从子包中获取错误详细信息。

此解决方案将获取子包具有的任何错误,并将错误消息传递给父包。然后父包将接收它收到的错误并在父包执行结果中发布完整的详细信息。

注意:编写逻辑使得子包仍然可以自己运行(而不是作为子包),而不会在父包中丢失变量名称时出现任何错误。此外,如果您从父包运行子包但不想从子包中捕获错误,则不要包含变量名称或OnError事件处理程序,并且它不会以这种方式导致丢失变量的任何错误。 / p>

  1. 为整个子包创建了一个OnError事件处理程序。

  2. 向事件处理程序添加脚本任务。

    一个。将变量传递给Read Only:System :: ErrorDescription,System :: SourceName,System :: PackageName

    湾在脚本任务中执行此操作(注释应详细说明它正在执行的操作):

        // build our the error message
        string ErrorMessageToPassToParent = "Package Name:  " + Dts.Variables["System::PackageName"].Value.ToString() + Environment.NewLine + Environment.NewLine +
            "Step Failed On:  " + Dts.Variables["System::SourceName"].Value.ToString() + Environment.NewLine + Environment.NewLine +
            "Error Description:  " + Dts.Variables["System::ErrorDescription"].Value.ToString();
    
    
    
        // have to do this FIRST so you can access variable without passing it into the script task from SSIS tool box
        // populate collection of variables. This will include parent package variables.
        Variables vars = null;
        Dts.VariableDispenser.GetVariables(ref vars);
    
    
        // checks if this variable exists in parent first, and if so then will set it to the value of the child variable 
        //  (do this so if parent package does not have the variable it will not error out when trying to set a non-existent variable)
        if (Dts.VariableDispenser.Contains("OnError_ErrorDescription_FromChild") == true)
        {
    
            // Lock the to and from variables. 
            // parent variable
            Dts.VariableDispenser.LockForWrite("User::OnError_ErrorDescription_FromChild");
    
            // Need to call GetVariables again after locking them. Not sure why - perhaps to get a clean post-lock set of values.
            Dts.VariableDispenser.GetVariables(ref vars);
    
            // Set parentvar = childvar
            vars["User::OnError_ErrorDescription_FromChild"].Value = ErrorMessageToPassToParent;
    
            vars.Unlock();
        }
    
  3. 在父包中创建一个字符串变量:OnError_ErrorDescription_FromChild

  4. 在父包中为整个包创建一个OnError事件处理程序,并为其添加一个脚本任务。 (就像你上面的儿童套餐一样)

  5. 在脚本任务中将变量传递为只读:User :: OnError_ErrorDescription_FromChild

  6. 在脚本任务中执行以下操作:

        // get the variable from the parent package for the error
        string ErrorFromChildPackage = Dts.Variables["User::OnError_ErrorDescription_FromChild"].Value.ToString();
    
        // do a check if the value is empty or not (so we know if the error came from the child package or occurred in the parent package itself
        if (ErrorFromChildPackage.Length > 0)
        {
            // Then raise the error that was created in the child package
            Dts.Events.FireError(0, "Capture Error From Child Package Failure",
                    ErrorFromChildPackage   
                    , String.Empty, 0);
    
        } // end if the error length of variable is > 0