【问题标题】:Extract data from dtsx从 dtsx 中提取数据
【发布时间】:2021-04-26 11:36:20
【问题描述】:

我需要创建一个自动进程,在几个 *.dtsx(2017 版)中搜索正在使用哪些表,是否可以这样做?

最后,将包名保存在一个表中,以及该包中使用的是哪个表。

感谢您的宝贵时间

【问题讨论】:

    标签: sql-server ssis ssis-2017


    【解决方案1】:

    有文档工具,你可以在这篇文章中找到一些例子:https://dbmstools.com/categories/ssis-documentation-tools。

    如果你想自己做,那么它的范围可以从简单到非常复杂的任务。

    最后一个.dtsx 是一个XML 文件。如果您知道要查找哪些表,并且只需要知道这些表是否在包中的某个位置命名,那么简单的搜索就可以为您提供答案。

    现在,如果您需要知道哪些表以及它们在包中的使用方式(例如输入、输出、通过 OLE 或 sql 命令等),那么您可能需要使用 xpath 分析 XML 文件,通过powershell 或SQL 这可能非常复杂。

    如果将包部署到 SSIS 目录,您可以在 SSISDB 表中找到一些信息。

    如果启用了custom logs 并且包已经运行,您也许可以在logs 中获取信息。

    【讨论】:

      【解决方案2】:

      DTSX 基本上是 XML 文件。您可以将内容加载到 xml 变量并查询那里正在使用的表名。

      Reference MSDN wiki link。为了您的需要,我稍微修改了代码。以下代码未经测试。

      declare @t table
      (
      x xml
      )
       
      declare @ObjectName varchar(100) = <Your Object Name To be Searched>
       
      INSERT @t
      SELECT *
      FROM OPENROWSET(BULK '<Full Package Path>',
         SINGLE_BLOB) AS x;
      
      WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' AS DTS,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask)
         SELECT   t.u.value('.','varchar(100)')
         FROM DTSPackages
         CROSS APPLY x.nodes('/DTS:Executable/DTS:Property[@DTS:Name="ObjectName"]')t(u)
         WHERE
         x.exist('//SQLTask:SqlTaskData[contains(./@SQLTask:SqlStatementSource,sql:variable("@ObjectName"))]')=1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2016-09-23
        • 2020-11-03
        • 1970-01-01
        • 2014-10-12
        相关资源
        最近更新 更多