【问题标题】:How to query XML as used in .dtsx (SSIS)如何查询 .dtsx (SSIS) 中使用的 XML
【发布时间】:2017-05-12 12:39:20
【问题描述】:

我已经制作了一个 SSIS 2014 包(项目部署)。

在这里您可以看到它的 XML 内容的(相关)部分:

    <DTS:Executable DTS:refId="Package\Drop and Create statements voor tabellen\Drop and Create Classes_staging" DTS:CreationName="Microsoft.ExecuteSQLTask" DTS:Description="Execute SQL Task" DTS:DTSID="{60C174A8-D9C0-4F2A-B783-77753552BFCB}" DTS:ExecutableType="Microsoft.ExecuteSQLTask" DTS:LocaleID="-1" DTS:ObjectName="Drop and Create Classes_staging" DTS:TaskContact="Execute SQL Task; Microsoft Corporation; SQL Server 2014; © 2014 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1" DTS:ThreadHint="7">
      <DTS:Variables />
      <DTS:ObjectData>
        <SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" SQLTask:Connection="{c25e8858-9d6b-424d-b231-3ae05aed0d4b}" SQLTask:SqlStatementSource="/****** Table [dbo].[Classes_staging] ******/&#xA;IF OBJECT_ID('[dbo].[Classes_staging]') IS NOT NULL&#xA;DROP TABLE [dbo].[Classes_staging];&#xA;GO&#xA;&#xA;CREATE TABLE [dbo].[Classes_staging](&#xA;&#x9;[Reference] [nvarchar](50) NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]&#xA;&#xA;GO&#xA;&#xA;&#xA;" />
      </DTS:ObjectData>
    </DTS:Executable>

使用 OPENROWSET 将该文件导入到表中:

INSERT INTO Packages(XMLContent)
SELECT CONVERT(XML, BulkColumn) AS xContent
FROM OPENROWSET(BULK 'myFile.dtsx', SINGLE_BLOB) AS x;

现在我正在尝试查询它:

;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' AS  
DTS,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask) 

--Alle Executables
SELECT      Pkg.props.value('./@DTS:DTSID','nvarchar(max)') as [DTSID]
            ,Pkg.props.value('./@DTS:refId','nvarchar(max)') as [Executable]
            ,Pkg.props.value('./@DTS:ObjectName','nvarchar(max)') as [ObjectName]
            ,Pkg.props.value('./@DTS:Description','nvarchar(max)') as [Description]
            ,Pkg.props.value('./@DTS:ExecutableType','nvarchar(max)') as [ExecutableType]
            ,Pkg.props.value('./@SQLTask:SqlStatementSource','nvarchar(max)') as [SqlStatementSource]
FROM    (SELECT XMLContent AS pkgXML FROM packages) t

--CROSS APPLY pkgXML.nodes('//SQLTask:SqlTaskData') Pkg(props)
CROSS APPLY pkgXML.nodes('//DTS:Executable' ) Pkg(props)

我可以找到包中使用的所有 SQLStatement或者我可以找到有关可执行文件的详细信息。我可以通过交换上面提到的两个 CROSS APPLY 来做到这一点。 但我不能两者都做......我在这里错过了什么?

【问题讨论】:

    标签: xml tsql xquery ssis-2012


    【解决方案1】:
    ;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' AS  
    DTS,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask) 
    
    --Alle Executables
    SELECT      X.Exe.value('./@DTS:DTSID','nvarchar(max)') as [DTSID]
                ,X.Exe.value('./@DTS:refId','nvarchar(max)') as [Executable]
                ,X.Exe.value('./@DTS:ObjectName','nvarchar(max)') as [ObjectName]
                ,X.Exe.value('./@DTS:Description','nvarchar(max)') as [Description]
                ,X.Exe.value('./@DTS:ExecutableType','nvarchar(max)') as [ExecutableType]
                ,Y.Task.value('./@SQLTask:SqlStatementSource','nvarchar(max)') as [SqlStatementSource]
    
    FROM    (SELECT XMLContent  AS pkgXML FROM packages) t
    
    CROSS APPLY pkgXML.nodes('//DTS:Executable' ) X(Exe)
    OUTER APPLY X.Exe.nodes('./DTS:ObjectData/SQLTask:SqlTaskData') Y(Task)
    

    【讨论】:

      【解决方案2】:

      在第一个 CROSS APPLY 的结果上执行另一个 CROSS APPLY,它会分解 SqlTaskData 上的 XML:

      ;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' AS  
      DTS,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask) 
      
      --Alle Executables
      SELECT      Y.Task.value('./@DTS:DTSID','nvarchar(max)') as [DTSID]
                  ,Y.Task.value('./@DTS:refId','nvarchar(max)') as [Executable]
                  ,Y.Task.value('./@DTS:ObjectName','nvarchar(max)') as [ObjectName]
                  ,Y.Task.value('./@DTS:Description','nvarchar(max)') as [Description]
                  ,Y.Task.value('./@DTS:ExecutableType','nvarchar(max)') as [ExecutableType]
                  ,X.Exe.value('./@SQLTask:SqlStatementSource','nvarchar(max)') as [SqlStatementSource]
      FROM    (SELECT XMLContent AS pkgXML FROM packages) t
      
      CROSS APPLY pkgXML.nodes('//DTS:Executable' ) X(Exe)
      CROSS APPLY X.Exe.nodes('./DTS:ObjectData/SQLTask:SqlTaskData') Y(Task)
      

      【讨论】:

      • 不得不在 SELECT 语句中切换 Y.Task 和 X.exe 并制作第二个 APPLY 的 OUTER APPLY 但这成功了!感谢您为我指明正确的方向。
      猜你喜欢
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多