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

时间:2008-09-17 17:12:47

标签: sql xml

说我有这个表(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字符串中是否会有多少'Type'(例如AAA,BBB,CCC,DDD等)。

3 个答案:

答案 0 :(得分:1)

您需要使用XML querying in sql server来执行此操作。

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

不确定这是100%正确的xquery语法,但它会是这样的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您需要使用CROSS APPLY。以下是基于您的请求的示例:

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无效,第一行缺少Value的开始Type BBB元素。