Sat*_*tel 8 c# sql-server ssis etl reverse-engineering
还有就是提取物的需求source,destination以及column名称source和destination。我之所以尝试这样做,是因为我有成千上万个软件包,并且打开每个软件包的平均60 to 75列数和列出所有必需的信息将花费大量时间,而不是一个单一的时间要求,并且此任务每隔两个手工完成一次目前在我的组织中工作了几个月。
我正在寻找一些反向工程方法,将所有程序包保存在一个文件夹中,然后遍历每个程序包并获取信息,并将其放入一些电子表格中。
我想到了打开程序包xml并获取感兴趣的节点的信息,然后将其放入电子表格中,这很麻烦。请提出哪些可用的库开始。
SQL Server提供程序集以编程方式操作程序包。
要进行逆向工程(反序列化dtsx软件包),您必须通过遍历软件包并以编程方式阅读它们来执行此操作,只需遵循此详细链接
还有另一种方法(更困难的方法,不建议这样做),方法是将dtsx读取为文本文件并解析xml内容。查看以下问题的答案以获取示例:
暗示:
只需在Visual Studio中打开包装即可。转到package explorer选项卡(在control flow和data flow选项卡附近),您将找到树视图。它会引导您找到所需组件的方式
如果要查找列出所有包对象的脚本,则可以使用类似的脚本:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在Git-Hub上启动了一个名为SSISPackageExplorer的小项目,该项目允许用户读取TreeView中的包对象。目前这是非常基本的操作,但我会在一段时间内尝试对其进行改进:
| 归档时间: |
|
| 查看次数: |
1572 次 |
| 最近记录: |