XML-запрос поможет вернуть несколько узлов - PullRequest
2 голосов
/ 17 августа 2011

Я давно работаю с SQL, но новые системы требуют от меня изучения XQuery.

У меня был хороший поиск, но я не могу найти ответ новичка на этот вопрос, я пытаюсь запросить поле XML, чтобы вернуть несколько строк данных, где у клиента несколько телефонных номеров.Поле XML хранится на уровне клиента и имеет форму:

   <p1:Telephone>
     <p1:Type code="Home">Home</p1:Type>
     <p1:TelephoneNumber>01234 987654</p1:TelephoneNumber>
   </p1:Telephone>
   <p1:Telephone>
     <p1:Type code="Business">Business</p1:Type>
     <p1:TelephoneNumber>01324 123456</p1:TelephoneNumber>
   </p1:Telephone>

Сведения о клиенте выше этого в XML, но это бит, с которым я борюсь.

Я хотел бы вернуть данные в анализатор запросов в виде отдельных столбцов, т.е.

    Client A | Home | 01234 987654
    Client A | Business | 01324 1234546
    Client B | .... | ....

Может ли кто-нибудь указать мне правильное направление для этого?

Большое спасибо,

Джон

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Вы можете использовать новый тип данных XML, как этот, предполагая, что XML выглядит в ответе, предоставленном openshac , а YourTable имеет один столбец ClientName и один столбец XMLCol.

;with xmlnamespaces ('http://org.test' as p1)
select X.ClientName,
       T.N.value('p1:Type[1]/@code', 'varchar(25)') as TypeCode,
       T.N.value('p1:Type[1]', 'varchar(25)') as TypeValue,
       T.N.value('p1:TelephoneNumber[1]', 'varchar(25)') as TelephoneNumber
from YourTable as X
  cross apply X.XMLCol.nodes('/root/p1:Telephone') as T(N)

Редактировать

;with xmlnamespaces ('f2.co.uk/f2/1.0' as p1) 
select X.ClientReference, 
       T.N.value('p1:Type[1]/@code', 'varchar(25)') as TypeCode, 
       T.N.value('p1:Type[1]', 'varchar(25)') as TypeValue, 
       T.N.value('p1:TelephoneNumber[1]', 'varchar(25)') as TelephoneNumber 
from #tempa as X 
  cross apply X.[Xml].nodes('//p1:CommunicationChannel/p1:Telephone') AS T(N)
0 голосов
/ 17 августа 2011

Вы не включили свой полный XML, поэтому я не вижу, откуда вы получаете информацию о клиенте, но попробуйте это:

    DECLARE @xml nvarchar(max) = '<root xmlns:p1="http://org.test">
   <p1:Telephone>
     <p1:Type code="Home">Home</p1:Type>
     <p1:TelephoneNumber>01234 987654</p1:TelephoneNumber>
   </p1:Telephone>
   <p1:Telephone>
     <p1:Type code="Business">Business</p1:Type>
     <p1:TelephoneNumber>01324 123456</p1:TelephoneNumber>
   </p1:Telephone></root>'

    DECLARE @xml_handle int  
    EXEC sp_XML_preparedocument @xml_handle OUTPUT, @xml, '<root xmlns:p1="http://org.test" />'

    SELECT * FROM 
    OPENXML( @xml_handle, '//p1:Telephone') 
    WITH (
        [Type]              varchar(10) './p1:Type',
        [Code]              varchar(10) './p1:Type/@code',
        [TelephoneNumber]   varchar(10) './p1:TelephoneNumber'
    )

  EXEC sp_xml_removedocument @xml_handle    

возвращается:

Тип, код, TelephoneNumber

Дом, Дом, 01234 9876

Бизнес, Бизнес, 01324 1234

...