Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 XQuery中的子元素和孙元素数目未知_Sql Server_Xml_Xquery Sql - Fatal编程技术网

Sql server XQuery中的子元素和孙元素数目未知

Sql server XQuery中的子元素和孙元素数目未知,sql-server,xml,xquery-sql,Sql Server,Xml,Xquery Sql,我已将许多大型XML文件加载到MSSQL数据库中的XML字段/表中。我的表(称为XMLImport)有两列;XML文件的ID列和标记为XMLColumn的第二列。我现在需要从数据中获取某些元素,以便将其加载到数据库中的各个位置。我在下面介绍了XML文件的基本格式。元素、子元素和子元素的数量因每个文件而异 <root> <data1>apples</data1> <data2>pears</data2> <data3&g

我已将许多大型XML文件加载到MSSQL数据库中的XML字段/表中。我的表(称为XMLImport)有两列;XML文件的ID列和标记为XMLColumn的第二列。我现在需要从数据中获取某些元素,以便将其加载到数据库中的各个位置。我在下面介绍了XML文件的基本格式。元素、子元素和子元素的数量因每个文件而异

<root>
  <data1>apples</data1>
  <data2>pears</data2>
  <data3>coconuts</data3>   
  <element1>
    <data1>white</data1>
    <data2>brown</data2>
    <data3>green</data3>
    <data4>yellow</data4>
    <data5>blue</data5>
    <subelement1>
        <data1>one</data1>
        <data2>two</data2>
        <data3>three</data3>
        <data4>four</data4>         
        <subsubelement1>
            <data1>name1</data1>
            <data2>slow</data2>
        </subsubelement1>
        <subsubelement2>
            <data1>name2</data1>
            <data2>fast</data2>
        </subsubelement2>
    </subelement1>
    <subelement2>
        <data1>five</data1>
        <data2>six</data2>
        <data3>seven</data3>
        <data4>eight</data4>    
        <subsubelement1>
            <data1>name3</data1>
            <data2>fast</data2>
        </subsubelement1>
    </subelement2>
  </element1>
  <element2>
    <data1>red</data1>
    <data2>pink</data2>
    <data3>purple</data3>
    <data4>black</data4>
    <subelement1>
        <data1>nine</data1>
        <data2>ten</data2>
        <data3>eleven</data3>
        <data4>twelve</data4>           
    </subelement1>
    <subelement2>
        <data1>thirteen</data1>
        <data2>fourteen</data2>
        <data3>fifteen</data3>
        <data4>sixteen</data4>  
        <subsubelement1>
            <data1>name1</data1>
            <data2>fast</data2>
        </subsubelement1>
    </subelement2>
  </element2>
  <element3>
    <data1>text</data1>
    <data2>text</data2>
    <data3>text</data3>
    <data4>text</data4>
    <data5>text</data5>
    <subelement1>
        <data1>text</data1>
        <data2>text</data2>
        <data3>text</data3>
        <data4>text</data4>         
        <subsubelement1>
            <data1>text</data1>
            <data2>text</data2>
        </subsubelement1>
    </subelement1>
  </element3>
</root>
无论一个子元素下有多少个子元素,我都需要从子元素级别获取数据。然后我需要转到下一个子元素并做同样的事情。然后转到数据中的下一个元素并重复。这是我目前的问题

USE MyDatabase
GO
SELECT XMLColumn.value('(/root/data1)[1]','varchar(150)') AS FirstColumn,
       XMLColumn.value('(/root/data2)[1]','varchar(150)') AS SecondColumn,
       XMLColumn.value('(/root/element1/data1)[1]','varchar(150)') AS ThirdColumn,
       XMLColumn.value('(/root/element1/data2)[1]','varchar(150)') AS FourthColumn,
       XMLColumn.value('(/root/element1/subelement1/data2)[1]','varchar(150)') AS FifthColumn,
       XMLColumn.value('(/root/element1/subelement1/subsubelement1/data1)[1]','varchar(150)') AS SixthColumn,
       XMLColumn.value('(/root/element1/subelement1/subsubelement1/data2)[1]','varchar(150)') AS SeventhColumn
FROM dbo.XMLImport

如果我将[1]更改为另一个数字,我可以得到该级别的下一个值,但不能得到多个值。有没有办法让我循环浏览这些数据?感谢您的帮助。谢谢。

你可以试试这样的东西,但是——老实说——我不知道你想怎么把它并列起来


你可能会尝试这样的事情,但是-说实话-我不知道你想如何把它并排放在一起


在真正的XML中:元素真的编号了吗(data1,data2,…)@Shnugo-不,我的数据是分类的,我只是想编一些东西来显示我有多少层和可变性。我对XML没有任何经验。我是一名SQL程序员。在你真正的XML中:元素真的编号了吗(data1,data2,…)@Shnugo-不,我的数据是分类的,我只是想编一些东西来显示我有多少层和可变性。我对XML没有任何经验。我是一名SQL程序员。谢谢你,我将尝试一下。我真的不需要在一行中显示东西,我需要能够将它们加载到表中的一行中。我只是想说明,如果有多个子元素,一行中的一些字段需要与另一行中的字段相同。谢谢,我将尝试一下。我真的不需要在一行中显示东西,我需要能够将它们加载到表中的一行中。我只是想说明,如果有多个子元素,一行中的一些字段需要与另一行相同。
USE MyDatabase
GO
SELECT XMLColumn.value('(/root/data1)[1]','varchar(150)') AS FirstColumn,
       XMLColumn.value('(/root/data2)[1]','varchar(150)') AS SecondColumn,
       XMLColumn.value('(/root/element1/data1)[1]','varchar(150)') AS ThirdColumn,
       XMLColumn.value('(/root/element1/data2)[1]','varchar(150)') AS FourthColumn,
       XMLColumn.value('(/root/element1/subelement1/data2)[1]','varchar(150)') AS FifthColumn,
       XMLColumn.value('(/root/element1/subelement1/subsubelement1/data1)[1]','varchar(150)') AS SixthColumn,
       XMLColumn.value('(/root/element1/subelement1/subsubelement1/data2)[1]','varchar(150)') AS SeventhColumn
FROM dbo.XMLImport
DECLARE @xml XML=
'<root>
  <data1>apples</data1>
  <data2>pears</data2>
  <data3>coconuts</data3>   
  <element1>
    <data1>white</data1>
    <data2>brown</data2>
    <data3>green</data3>
    <data4>yellow</data4>
    <data5>blue</data5>
    <subelement1>
        <data1>one</data1>
        <data2>two</data2>
        <data3>three</data3>
        <data4>four</data4>         
        <subsubelement1>
            <data1>name1</data1>
            <data2>slow</data2>
        </subsubelement1>
        <subsubelement2>
            <data1>name2</data1>
            <data2>fast</data2>
        </subsubelement2>
    </subelement1>
    <subelement2>
        <data1>five</data1>
        <data2>six</data2>
        <data3>seven</data3>
        <data4>eight</data4>    
        <subsubelement1>
            <data1>name3</data1>
            <data2>fast</data2>
        </subsubelement1>
    </subelement2>
  </element1>
  <element2>
    <data1>red</data1>
    <data2>pink</data2>
    <data3>purple</data3>
    <data4>black</data4>
    <subelement1>
        <data1>nine</data1>
        <data2>ten</data2>
        <data3>eleven</data3>
        <data4>twelve</data4>           
    </subelement1>
    <subelement2>
        <data1>thirteen</data1>
        <data2>fourteen</data2>
        <data3>fifteen</data3>
        <data4>sixteen</data4>  
        <subsubelement1>
            <data1>name1</data1>
            <data2>fast</data2>
        </subsubelement1>
    </subelement2>
  </element2>
  <element3>
    <data1>text</data1>
    <data2>text</data2>
    <data3>text</data3>
    <data4>text</data4>
    <data5>text</data5>
    <subelement1>
        <data1>text</data1>
        <data2>text</data2>
        <data3>text</data3>
        <data4>text</data4>         
        <subsubelement1>
            <data1>text</data1>
            <data2>text</data2>
        </subsubelement1>
    </subelement1>
  </element3>
</root>';
SELECT  lvl1.value('(./text())[1]','nvarchar(max)') AS NodeValue1
       ,lvl2.value('(./text())[1]','nvarchar(max)') AS NodeValue2
       ,lvl3.value('(./text())[1]','nvarchar(max)') AS NodeValue3
       ,lvl4.value('(./text())[1]','nvarchar(max)') AS NodeValue4
FROM @xml.nodes('/root/*') AS A(lvl1)
OUTER APPLY lvl1.nodes('*') AS B(lvl2)
OUTER APPLY lvl2.nodes('*') AS C(lvl3)
OUTER APPLY lvl3.nodes('*') AS D(lvl4)