【问题标题】:SSIS Extraction/ DTSXSSIS 提取/DTSX
【发布时间】:2021-09-02 18:06:43
【问题描述】:

我在 Stack 上得到了这个惊人的代码,但它是 8 年前的,但运行良好,但是当运行 t 脚本时,ObjectName 列总是为 NULL,如果可能的话,有人可以帮我修复它吗?

SQL 脚本

SELECT Pkg.props.value('../../DTS:Property[@DTS:Name="ObjectName"]
[1]','varchar(MAX)') ObjectName, 
Pkg.props.value('(@SQLTask:SqlStatementSource)[1]', 'NVARCHAR(MAX)') AS 
SqlStatement FROM (select cast(pkgblob.BulkColumn as XML) pkgXML from 
openrowset(bulk '\\MYDTS.dtsx',single_blob) 
as pkgblob) t CROSS APPLY pkgXML.nodes('//DTS:ObjectData//SQLTask:SqlTaskData') Pkg(props) 
  UNION 
SELECT Pkg.props.value('../../../../DTS:Property[@DTS:Name="ObjectName"]
[1]','varchar(MAX)') ObjectName, 
Pkg.props.value('data(./properties/property[@name=''SqlCommand''])[1]', 
'varchar(max)') SqlStatement FROM(select cast(pkgblob.BulkColumn as XML) 
 pkgXML from openrowset(bulk '\\MYDTS.dtsx',single_blob) as 
 pkgblob) t CROSS APPLY 
 pkgXML.nodes('//DTS:Executable//pipeline//components//component') Pkg(props) 
WHERE Pkg.props.value('data(./properties/property[@name=''SqlCommand''])
[1]', 'varchar(max)') <>''

结果附在下面。我想显示 ObjectName 而不是 NULL,但我不知道如何修复它。

【问题讨论】:

    标签: sql ssis


    【解决方案1】:

    ObjectName 不再是几年前的样子/位置。

    您需要以 XML 格式浏览当前的 dtsx 并找到您的等效 ObjectName。

    SELECT CONVERT(XML, BulkColumn) AS BulkColumn FROM OPENROWSET(BULK 'C:\PathToPackage\MYDTS.dtsx', SINGLE_BLOB) AS x;
    

    我的示例 dtsx 在 XML 格式中如下所示:

    <DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:refId="Package" DTS:CreationDate="7/23/2019 7:23:29 AM" DTS:CreationName="Microsoft.Package" DTS:CreatorComputerName="Overflow" DTS:CreatorName="Overflow\Stack" DTS:DTSID="{DEED1FFC-FCE3-4C63-A90C-3382EDA388A1}" DTS:ExecutableType="Microsoft.Package" DTS:LastModifiedProductVersion="14.0.3002.113" DTS:LocaleID="1033" DTS:ObjectName="deduplicate" DTS:PackageType="5" DTS:VersionBuild="20" DTS:VersionGUID="{27B38889-4D80-45F6-9CB0-F6B430B1DBBE}">
      <DTS:Property DTS:Name="PackageFormatVersion">8</DTS:Property>
      <DTS:Variables />
      <DTS:Executables>
        <DTS:Executable DTS:refId="Package\Execute SQL Task" DTS:CreationName="Microsoft.ExecuteSQLTask" DTS:Description="Execute SQL Task" DTS:DTSID="{A6053AE9-7445-4973-9AFD-E3AFFE97B68F}" DTS:ExecutableType="Microsoft.ExecuteSQLTask" DTS:LocaleID="-1" DTS:ObjectName="Execute SQL Task" DTS:TaskContact="Execute SQL Task; Microsoft Corporation; SQL Server 2017 RC1; © 2017 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1" DTS:ThreadHint="1">
          <DTS:Variables />
          <DTS:ObjectData>
            <SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" SQLTask:SqlStatementSource="Select GetDate()" />
          </DTS:ObjectData>
        </DTS:Executable>
    ...
    

    在这个特定的 XML 中,接下来的待办事项:

    • 取出所有属于 SqlTask​​Data 的内容
    • 检索 SqlStatementSource 值
    • 走上两层“../../”到 DTS:Executable 并检索 ObjectName 属性
    WITH XMLNAMESPACES(
        'www.microsoft.com/SqlServer/Dts' AS DTS,
        'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask
    ), 
    dtsxAsXML AS (
        SELECT CONVERT(XML, BulkColumn) AS BulkColumn 
        FROM OPENROWSET(BULK 'C:\PathToPackage\MYDTS.dtsx', SINGLE_BLOB) AS x
    )
    SELECT 
        X.Y.value('(../../@DTS:ObjectName)[1]', 'NVARCHAR(MAX)') AS ObjectName,
        X.Y.value('(@SQLTask:SqlStatementSource)[1]', 'NVARCHAR(MAX)') AS SqlStatementSource 
    FROM dtsxAsXML d
    CROSS APPLY d.BulkColumn.nodes('//DTS:ObjectData//SQLTask:SqlTaskData') X(Y)
    
    ObjectName SqlStatementSource
    Execute SQL Task Select GetDate()

    对数据流组件(示例中的底部联合)重复此过程。

    由于您已经获得了 SQL 语句,因此您不需要使用这些示例查询,您只需要查看 dtsx 中的 xml,然后找到现有查询中的相对路径并将其更改为您的值想要。

    【讨论】:

    • 您好,非常感谢,我会尝试...再次,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2020-04-23
    相关资源
    最近更新 更多