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)