如何将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"元素。