Конвертировать XML в строки - PullRequest
       16

Конвертировать XML в строки

1 голос
/ 27 октября 2009

Допустим, у меня есть xml, хранящийся в базе данных. Содержит список контактов, например:

<Person>
 <Name>Irwin</Name>
 <Address>Home, In a place</Address>
 <Contact type="mobile">7771234</Contact>
 <Contact type="home">6311234</Contact>
 <Contact type="work">6352234</Contact>
 <Contact type="fax">6352238</Contact>
</Person>

Он хранится в столбце xml в базе данных сервера sql, в таблице с такой структурой:

TABLE [Contacts](
 [ID] [bigint] IDENTITY(1,1) NOT NULL,
 [Info] [xml] NOT NULL,
 [Status] [tinyint] NOT NULL,
 [CreateTime] [datetime] NOT NULL,
) ON [PRIMARY]

Я хотел бы написать запрос, который преобразует элементы Contact в строки новой таблицы, соответствующие полю идентификатора таблицы Contacts.

Я пробовал это:

SELECT  Cast(Request.query('/Person/Contact/text()')  as varchar(100)) as [Number], ID 
FROM Contacts

Но он извлекает все данные из данного фрагмента XML в столбце и помещает их все в одну строку вместе с идентификатором этой строки, например так:

Номер, ID

7771234631123463522346352238, 1500

Когда я хотел бы получить это:

Номер, ID

7771234, 1500

6311234, 1500

6352234, 1500

6352238, 1500

Можете ли вы указать мне правильное направление?

Ответы [ 3 ]

5 голосов
/ 27 октября 2009

Используйте CROSS APPLY и методы XML

DECLARE @t TABLE ( ID INT, tag XML )

INSERT  INTO @t
        ( ID ,
          tag 
        )
VALUES  ( 1500 , -- ID - int
          '<Person> 
            <Name>Irwin</Name> 
            <Address>Home, In a place</Address> 
            <Contact type="mobile">7771234</Contact> 
            <Contact type="home">6311234</Contact> 
            <Contact type="work">6352234</Contact> 
            <Contact type="fax">6352238</Contact>
          </Person>'          
        ) 

SELECT  Number = Contact.value('.', 'varchar(MAX)') ,
        t.id
FROM    @t t
        CROSS APPLY tag.nodes('/Person/Contact') AS tag ( Contact )    
0 голосов
/ 27 октября 2009

если числа одинаковой длины (7), попробуйте использовать подстроку

select 
substring((Cast(Request.query('/Person/Contact/text()')  as varchar(100))),0,8) mobile,
substring((Cast(Request.query('/Person/Contact/text()')  as varchar(100))),8,16) home,
substring((Cast(Request.query('/Person/Contact/text()')  as varchar(100))),16,24) work,
substring((Cast(Request.query('/Person/Contact/text()')  as varchar(100))),24,32) fax,
id
from contacts
0 голосов
/ 27 октября 2009

Только указатель ...

Вам понадобится явный запрос xpath для каждого столбца, который вы хотите получить в результате. Ваш запрос вытягивает все текст из XML в один столбец.

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