Как я могу вернуть содержимое поля XML в виде набора записей? - PullRequest
2 голосов
/ 17 сентября 2008

Скажите, у меня есть эта таблица (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  

Обратите внимание, что я не буду знать, сколько будет 'Type' (например, AAA, BBB, CCC, DDD и т. Д.) В строке xml.

Ответы [ 3 ]

1 голос
/ 17 сентября 2008

Для этого вам понадобится XML-запрос на сервере sql .

что-то вроде

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

не уверен, что это правильный синтаксис xquery на 100%, но это будет что-то вроде этого.

0 голосов
/ 08 октября 2008

Вам нужно будет использовать 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.

0 голосов
/ 05 октября 2008

Один из возможных вариантов - использовать XMLDataDocument . Используя этот класс, вы можете извлечь данные в виде XML, загрузить их в XmlDataDocument и затем использовать свойство Dataset для доступа к ним, как если бы это был стандартный набор данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...