如何将XML字段的内容作为记录集返回?

时间:2020-03-05 18:59:27  来源:igfitidea点击:

说我有此表(SQL Server 2005):

Id => integer  
MyField => XML

ID MyField

1   < Object>< Type>AAA< /Type>< Value>10< /Value>< /Object>< Object>< Type>BBB< /Type><Value>20< /Value>< /Object>  
2   < Object>< Type>AAA< /Type>< Value>15< /Value>< /Object>  
3   < Object>< Type>AAA< /Type>< Value>20< /Value>< /Object>< Object>< Type>BBB< /Type>< Value>30< /Value>< /Object>

我需要一个TSQL查询,该查询将返回类似以下内容的内容:

Id  AAA     BBB  
1   10      20  
2   15      NULL  
3   20      30

请注意,我不知道是否提前在xml字符串中有多少个"类型"(例如AAA,BBB,CCC,DDD等)。

解决方案

回答

我们将需要在sql server中使用XML查询来执行此操作。

select id, MyField.query('/Object/Type[.="AAA"]/Value') as AAA, MyField.query('/Object/Type[.="BBB"]/Value) AS BBB

不知道这是否是100%正确的xquery语法,但这将是类似的事情。

回答

一种可能的选择是使用XMLDataDocument。使用此类,我们可以将数据检索为XML,并将其加载到XmlDataDocument中,然后使用Dataset属性来访问它,就像它是标准数据集一样。

回答

我们需要使用"交叉应用"。这是根据请求的示例:

declare @y table (rowid int, xmlblock xml)
insert into @y values(1,'<Object><Type>AAA</Type><Value>10</Value></Object><Object><Type>BBB</Type><Value>20</Value></Object>')
insert into @y values(2,'<Object><Type>AAA</Type><Value>15</Value></Object>')
insert into @y values(3,'<Object><Type>AAA</Type><Value>20</Value></Object><Object><Type>BBB</Type><Value>30</Value></Object>')

select y.rowid, t.b.value('Type[1]', 'nvarchar(5)'), t.b.value('Value[1]', 'int')
from @y y  CROSS APPLY  XmlBlock.nodes('//Object') t(b)

哦,示例XML无效,第一行缺少类型BBB的开头" Value"元素。