【问题标题】:SQL Server - import XML fields from multiple levelsSQL Server - 从多个级别导入 XML 字段
【发布时间】:2017-11-16 00:24:55
【问题描述】:

我想将图表名称的 XML 层次结构值选择到该图表下所有过滤器值的第一列。

我使用了下面的方法,但 ChartName 返回 NULL。我怀疑我需要做一个子查询

DECLARE @input XML = 
'<Report>
    <DataSets>
    </DataSets>
    <ReportSections>
      <ReportSection>
        <ReportItems>
          <Chart Name="Hub1">
            <Filters>
                <Filter>
                  <Expression>Fields!Hub.Value</Expression>
                  <Operator>Like</Operator>
                  <Values>
                    <Value>Central</Value>
                  </Values>
                </Filter>
                <Filter>
                    <Expression>Fields!ADP_Hrs.Value</Expression>
                    <Operator>NotEqual</Operator>
                    <Values>
                      <Value DataType="Float">0</Value>
                    </Values>
                </Filter>
                <Filter>
                    <Expression>Fields!TL.Value</Expression>
                    <Operator>Equal</Operator>
                    <Values>
                      <Value DataType="Integer">1</Value>
                    </Values>
                </Filter>
            </Filters>
          </Chart>  
        </ReportItems>
      </ReportSection>
    </ReportSections>
</Report>'

SELECT
    [Tbl].[Col].value('Chart [4]', 'varchar(50)') as ChartName,
    [Tbl].[Col].value('Expression [1]', 'varchar(50)') as Expression,
    [Tbl].[Col].value(' Operator [1]', 'varchar(50)') as 'Operator',
    [Tbl].[Col].value(' Values [1]', 'varchar(50)') as 'Value'
FROM 
    @input.nodes('Report/ReportSections/ReportSection/ReportItems/Chart/Filters/Filter') as [Tbl]([Col])

预期输出:

ChartName  Expression              Operator    Value
------------------------------------------------------
Hub1       Fields!Hub.Value        Like        Central
Hub1       Fields!ADP_Hrs.Value    NotEqual    0 
Hub1       Fields!TL.Value         Equal       1

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    Chart 不在Filter 元素内,所以它找不到它,除非您沿着 XML 路径向后走,然后拉动 Chart 元素的 @Name 属性:

    SELECT
    [Tbl].[Col].value('(../../@Name)[1]', 'varchar(50)') as ChartName,
    [Tbl].[Col].value('Expression [1]', 'varchar(50)') as Expression,
    [Tbl].[Col].value(' Operator [1]', 'varchar(50)') as 'Operator',
    [Tbl].[Col].value(' Values [1]', 'varchar(50)') as 'Value'
    
    FROM @input.nodes('Report/ReportSections/ReportSection/ReportItems/Chart/Filters/Filter') as [Tbl]([Col])
    

    返回:

    ChartName      Expression              Operator     Value
    -------------- ----------------------- ------------ -------------
    Hub1           Fields!Hub.Value        Like         Central
    Hub1           Fields!ADP_Hrs.Value    NotEqual     0
    Hub1           Fields!TL.Value         Equal        1
    

    【讨论】:

    • 感谢 James 和 John,他们都工作得很好,这让我很好地理解了如何从上下层级返回结果
    【解决方案2】:

    另一种选择

    示例

    Select ChartName    = lvl1.n.value('@Name'        ,'varchar(50)') 
          ,Expression   = lvl2.n.value('Expression[1]','varchar(50)') 
          ,Operator     = lvl2.n.value('Operator[1]'  ,'varchar(50)') 
          ,Value        = lvl2.n.value('Values[1]'    ,'varchar(50)') 
     From  @input.nodes('Report/ReportSections/ReportSection/ReportItems/*') lvl1(n)
     Cross Apply lvl1.n.nodes('Filters/Filter') lvl2(n)
    

    退货

    ChartName   Expression              Operator    Value
    Hub1        Fields!Hub.Value        Like        Central
    Hub1        Fields!ADP_Hrs.Value    NotEqual    0
    Hub1        Fields!TL.Value         Equal       1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2013-05-26
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多