【问题标题】:Read xml .param SSIS file into SQL将 xml .param SSIS 文件读入 SQL
【发布时间】:2021-09-19 07:07:39
【问题描述】:

在当前的帖子中,我没有看到与此类似的 xml 文件。我正在尝试使用的文件是 Project.params SSIS 文件,如下所示:

<SSIS:Parameters xmlns:SSIS="www.microsoft.com/SqlServer/SSIS">
  <SSIS:Parameter SSIS:Name="PackageVersion">
    <SSIS:Properties>
      <SSIS:Property SSIS:Name="ID">{673faa65-53ec-483d-8af2-960987977177}</SSIS:Property>
      <SSIS:Property SSIS:Name="CreationName" />
      <SSIS:Property SSIS:Name="Description">The package version</SSIS:Property>
      <SSIS:Property SSIS:Name="IncludeInDebugDump">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Required">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Sensitive">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Value">1.0.0</SSIS:Property>
      <SSIS:Property SSIS:Name="DataType">18</SSIS:Property>
    </SSIS:Properties>
  </SSIS:Parameter>
  <SSIS:Parameter SSIS:Name="Debug">
    <SSIS:Properties>
      <SSIS:Property SSIS:Name="ID">{501b3d7c-f7ac-429b-bb2d-c314649d9c98}</SSIS:Property>
      <SSIS:Property SSIS:Name="CreationName" />
      <SSIS:Property SSIS:Name="Description">Determines whether the package is ran in debug mode</SSIS:Property>
      <SSIS:Property SSIS:Name="IncludeInDebugDump">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Required">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Sensitive">0</SSIS:Property>
      <SSIS:Property SSIS:Name="Value">true</SSIS:Property>
      <SSIS:Property SSIS:Name="DataType">3</SSIS:Property>
    </SSIS:Properties>
  </SSIS:Parameter>
</SSIS:Parameters>

我尝试在这里关注帖子:Read xml file in SQL Server 只是没有成功检索数据。这是我到目前为止的代码:

;WITH rs (xmldata) AS
(
   SELECT TRY_CAST(BulkColumn AS XML) AS BulkColumn 
   FROM OPENROWSET(BULK 'C:\Software\Project.params', SINGLE_BLOB) AS x
),cte AS
(
    SELECT a.value('@Parameter', 'NVARCHAR(50)') AS Parameter
       , c.value('@ID','NVARCHAR(50)') AS ID
       , c.value('@CreationName','NVARCHAR(50)') AS CreationName
       , c.value('@Description','NVARCHAR(100)') AS [Description]
       , c.value('@IncludeInDebugDump','INT') AS IncludeInDebugDump
       , c.value('@Required','INT') AS [Required]
       , c.value('@Sensitive','INT') AS Sensitive
       , c.value('@Value','NVARCHAR(10)') AS [Value]
       , c.value('@DataType','INT') AS DataType
    FROM rs AS tbl
       CROSS APPLY tbl.xmldata.nodes('/Parameters') AS t1(a)
       OUTER APPLY t1.a.nodes('/Parameter') AS t2(b)
       OUTER APPLY t2.b.nodes('/Properties') AS t3(c)
       OUTER APPLY t3.c.nodes('/Property') AS t4(d)
)
select * from cte

这运行成功(第一个 cte rs 正确提取数据)但第二个 cte 没有返回数据。没有错误,我得到了结果中的列,只是没有行。任何指导将不胜感激。

【问题讨论】:

    标签: sql sql-server xml ssis


    【解决方案1】:

    您需要在查询中指定命名空间,您需要过滤属性值上的节点,这很冗长,但这应该适合您,尽管您必须添加所需的其余列。

    SQL Fiddle

    MS SQL Server 2017 架构设置

    查询 1

    Declare @xmldata as xml =
    '<SSIS:Parameters xmlns:SSIS="www.microsoft.com/SqlServer/SSIS">
      <SSIS:Parameter SSIS:Name="PackageVersion">
        <SSIS:Properties>
          <SSIS:Property SSIS:Name="ID">{673faa65-53ec-483d-8af2-960987977177}</SSIS:Property>
          <SSIS:Property SSIS:Name="CreationName" />
          <SSIS:Property SSIS:Name="Description">The package version</SSIS:Property>
          <SSIS:Property SSIS:Name="IncludeInDebugDump">0</SSIS:Property>
          <SSIS:Property SSIS:Name="Required">0</SSIS:Property>
          <SSIS:Property SSIS:Name="Sensitive">0</SSIS:Property>
          <SSIS:Property SSIS:Name="Value">1.0.0</SSIS:Property>
          <SSIS:Property SSIS:Name="DataType">18</SSIS:Property>
        </SSIS:Properties>
      </SSIS:Parameter>
      <SSIS:Parameter SSIS:Name="Debug">
        <SSIS:Properties>
          <SSIS:Property SSIS:Name="ID">{501b3d7c-f7ac-429b-bb2d-c314649d9c98}</SSIS:Property>
          <SSIS:Property SSIS:Name="CreationName" />
          <SSIS:Property SSIS:Name="Description">Determines whether the package is ran in debug mode</SSIS:Property>
          <SSIS:Property SSIS:Name="IncludeInDebugDump">0</SSIS:Property>
          <SSIS:Property SSIS:Name="Required">0</SSIS:Property>
          <SSIS:Property SSIS:Name="Sensitive">0</SSIS:Property>
          <SSIS:Property SSIS:Name="Value">true</SSIS:Property>
          <SSIS:Property SSIS:Name="DataType">3</SSIS:Property>
        </SSIS:Properties>
      </SSIS:Parameter>
    </SSIS:Parameters>'
    

    这是查询:

    ;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/SSIS' as ns),  
    RS AS
    (
        SELECT @xmldata as xmlData
    )
    SELECT Parm.value('@ns:Name', 'NVARCHAR(50)') AS Parameter,
           Id.value('.', 'NVARCHAR(50)') AS Id,
           CreationName.value('.', 'NVARCHAR(50)') AS CreationName,
           [Description].value('.', 'NVARCHAR(100)') AS [Description]
    FROM RS
    CROSS APPLY xmlData.nodes('/ns:Parameters/ns:Parameter') as T2(Parm)  
    OUTER APPLY T2.Parm.nodes('./ns:Properties') AS T3(Props)
    OUTER APPLY T3.Props.nodes('./ns:Property[@ns:Name="ID"]') AS T4(Id)
    OUTER APPLY T3.Props.nodes('./ns:Property[@ns:Name="CreationName"]') AS T5(CreationName)
    OUTER APPLY T3.Props.nodes('./ns:Property[@ns:Name="Description"]') AS T6([Description])
    

    Results

    |      Parameter |                                     Id | CreationName |                                         Description |
    |----------------|----------------------------------------|--------------|-----------------------------------------------------|
    | PackageVersion | {673faa65-53ec-483d-8af2-960987977177} |              |                                 The package version |
    |          Debug | {501b3d7c-f7ac-429b-bb2d-c314649d9c98} |              | Determines whether the package is ran in debug mode |
    

    【讨论】:

    • 这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多