Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-从多个级别导入XML字段_Sql Server_Xml - Fatal编程技术网

Sql server SQL Server-从多个级别导入XML字段

Sql server SQL Server-从多个级别导入XML字段,sql-server,xml,Sql Server,Xml,我想将图表名称的XML层次结构值选择到该图表下所有过滤器值的第一列中 我使用了下面的方法,但ChartName返回空值。我想我需要做一个子查询 DECLARE @input XML = '<Report> <DataSets> </DataSets> <ReportSections> <ReportSection> <ReportItems> <

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

我使用了下面的方法,但ChartName返回空值。我想我需要做一个子查询

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])

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
另一种选择

示例

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

感谢James和John,他们都做得很好,这让我很好地理解了如何从上下继承权中返回结果
ChartName   Expression              Operator    Value
Hub1        Fields!Hub.Value        Like        Central
Hub1        Fields!ADP_Hrs.Value    NotEqual    0
Hub1        Fields!TL.Value         Equal       1