说我有这个表(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等)。
答案 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
元素。