需要提取sourcedestination的名称。为什么我要这样做是因为我有成千上万个包,打开每个包平均有column列,列出所有需要的信息将花费大量的时间,这不是一个单一的时间要求,这项任务目前在我的组织中每两个月手动完成一次。
我正在寻找一些方法来反向工程,将所有的包放在一个文件夹中,然后浏览每个包,获取信息并将其放在某个电子表格中。
我想在source中打开包,获取感兴趣节点的信息,并放入电子表格,这样做不太麻烦。请建议从哪些可用的库开始。

最佳答案

SQL Server提供程序集以编程方式操作包。
要执行反向工程(反序列化dtsx包),必须通过循环包并以编程方式读取它们来执行此操作,只需遵循以下详细链接
Reading DTS and SSIS packages programmatically
有另一种方法(更难的方法,不推荐)来实现这一点,方法是将dtsx读取为文本文件并解析xml内容。在下面的问题上检查我的答案以获取示例:
Automate Version number Retrieval from .Dtsx files
提示:
在visual studio中打开这个包。转到package explorer选项卡(靠近control flowdata flow选项卡),您将看到一个treeview。它将引导您搜索所需组件的方式
c# - 使用C#反向工程SSIS包-LMLPHP
更新1-c script@2019-07-08
如果要查找列出所有包对象的脚本,则可以使用类似的脚本:

using System;
using DtsRuntime = Microsoft.SqlServer.Dts.Runtime;
using DtsWrapper = Microsoft.SqlServer.Dts.Pipeline.Wrapper;

public void Main()
{
    string pkgLocation;
    DtsRuntime.Package pkg;
    DtsRuntime.Application app;
    DtsRuntime. DTSExecResult pkgResults;

    pkgLocation =
      @"D:\Test\Package 1.dtsx";
    app = new DtsRuntime.Application();
    pkg = app.LoadPackage(pkgLocation, null);

    //List Executables (Tasks)
    foreach(DtsRuntime.Executable tsk in pkg.Executables)
    {


        DtsRuntime.TaskHost TH = (DtsRuntime.TaskHost)tsk;
        MessageBox.Show(TH.Name + "\t" + TH.HostType.ToString());


        //Data Flow Task components
        if (TH.InnerObject.ToString() == "System.__ComObject")
        {
            try
            {

                DtsWrapper.MainPipe m = (DtsWrapper.MainPipe)TH.InnerObject;


                DtsWrapper.IDTSComponentMetaDataCollection100 mdc = m.ComponentMetaDataCollection;


                foreach (DtsWrapper.IDTSComponentMetaData100 md in mdc)


                {

                    MessageBox.Show(TH.Name.ToString() + " - " + md.Name.ToString());


                }

            }
            catch {

            // If it is not a data flow task then continue foreach loop

            }



        }



    }

    //Event Handlers
    foreach(DtsRuntime.DtsEventHandler eh in pkg.EventHandlers)
    {

        MessageBox.Show(eh.Name + " - " + CM.HostType);

    }

    //Connection Manager

    foreach(DtsRuntime.ConnectionManager CM in pkg.Connections)
    {

        MessageBox.Show(CM.Name + " - " + CM.HostType);


    }


    //Parameters
    foreach (DtsRuntime.Parameter Param in pkg.Parameters)
    {

        MessageBox.Show(Param.Name + " - " + Param.DataType.ToString());


    }


    //Variables
    foreach (DtsRuntime.Variable Var in pkg.Variables)
    {

        MessageBox.Show(Var.Name + " - " + Var.DataType.ToString());


    }

    //Precedence Constraints
    foreach (DtsRuntime.PrecedenceConstraint PC in pkg.PrecedenceConstraints)
    {

        MessageBox.Show(PC.Name);


    }

}

推荐信
Loading and Running a Local Package Programmatically
更新2-ssispackageexplorer项目@2019-07-10
我在git hub上启动了一个名为ssispackageexplorer的小项目,它允许用户在treeview中读取包对象,这是非常基本的,但我将在一段时间内尝试改进它:
GitHub - SSISPackageExplorer
c# - 使用C#反向工程SSIS包-LMLPHP

08-18 05:39