Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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 将xml列展平为新列_Sql Server_Xml - Fatal编程技术网

Sql server 将xml列展平为新列

Sql server 将xml列展平为新列,sql-server,xml,Sql Server,Xml,我有一张这样的桌子: ---id----Id2-----ID3----- 1 2 <Account ID="123" NR = "234" Type="type1" Ratio = "31"> <FIELD> <Name> Peter </Name> <LastName> Johnson &l

我有一张这样的桌子:

---id----Id2-----ID3-----
   1      2      <Account ID="123" NR = "234" Type="type1" Ratio = "31">
                  <FIELD>
                     <Name> Peter </Name>
                     <LastName> Johnson </LastName>
                     <Address> Millington </Address>
                     <Nr> 30 </Nr>
                  </FIELD>
                  <FIELD>
                     <Name> Jessica</Name>
                     <LastName> Johnson </LastName>
                     <Address> Millington </Address>
                     <Nr> 30 </Nr>
                  </FIELD>
                 </ACCOUNT>

您可以使用
节点
交叉应用
将xml分解为行级别:

declare @tmp table (id int,Id2 int,ID3 xml)
declare @xml XML = '<Account ID="123" NR = "234" Type="type1" Ratio = "31"> <FIELD> <Name> Peter </Name> <LastName> Johnson </LastName> <Address> Millington </Address> <Nr> 30 </Nr> </FIELD> <FIELD> <Name> Jessica</Name> <LastName> Johnson </LastName> <Address> Millington </Address> <Nr> 30 </Nr> </FIELD> </Account>'

insert into @tmp values(1, 2, @xml)

SELECT x.id
      ,x.id2
      ,c.value('Name[1]'    , 'nvarchar(200)') AS [Name]
      ,c.value('LastName[1]', 'nvarchar(200)') AS LastName
      ,c.value('Address[1]' , 'nvarchar(200)') AS [Address]
      ,c.value('Nr[1]'      , 'nvarchar(200)') AS Nr
FROM @tmp x
cross apply x.ID3.nodes('Account/FIELD') T(c)

是的,这是正确的:我的答案只包含一个示例,向您展示它是如何工作的。您应该编辑我的查询以将其直接应用于您的表。您能给我一个示例吗?根据我的example@JoeDoe当然:请编辑您的问题,为您的表添加DDL(
CREATE table…
)我将根据您的表的结构发布一个更新的答案。我将数据类型为XML的XML列加入到这个ID和ID2都为INT的表中…我试图通过只选择XML列来声明XML:declare XML=(select ITEM#u RESPONSE from#Temp2)但无法将变量设置为整个表…有意义…get错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。您创建的tmp表与我看到的起始表(在上面的示例中)完全相同。。。。
declare @tmp table (id int,Id2 int,ID3 xml)
declare @xml XML = '<Account ID="123" NR = "234" Type="type1" Ratio = "31"> <FIELD> <Name> Peter </Name> <LastName> Johnson </LastName> <Address> Millington </Address> <Nr> 30 </Nr> </FIELD> <FIELD> <Name> Jessica</Name> <LastName> Johnson </LastName> <Address> Millington </Address> <Nr> 30 </Nr> </FIELD> </Account>'

insert into @tmp values(1, 2, @xml)

SELECT x.id
      ,x.id2
      ,c.value('Name[1]'    , 'nvarchar(200)') AS [Name]
      ,c.value('LastName[1]', 'nvarchar(200)') AS LastName
      ,c.value('Address[1]' , 'nvarchar(200)') AS [Address]
      ,c.value('Nr[1]'      , 'nvarchar(200)') AS Nr
FROM @tmp x
cross apply x.ID3.nodes('Account/FIELD') T(c)
SELECT x.id
      ,x.id2
      ,c.value('Name[1]'    , 'nvarchar(200)') AS [Name]
      ,c.value('LastName[1]', 'nvarchar(200)') AS LastName
      ,c.value('Address[1]' , 'nvarchar(200)') AS [Address]
      ,c.value('Nr[1]'      , 'nvarchar(200)') AS Nr
FROM [YOUR_TABLE_NAME_HERE] x
cross apply x.ID3.nodes('Account/FIELD') T(c)