2013-09-18 1 views
1

У меня есть запрос SQL, который возвращает мне XML нижеКак объединить данные из XML-запроса SQL Server?

<row> 
    <urlSegment>electronics</urlSegment> 
    <shortenedUrlSegment>0x58</shortenedUrlSegment> 
</row> 
<row> 
    <urlSegment>phones</urlSegment> 
    <shortenedUrlSegment>0x5AC0</shortenedUrlSegment> 
</row> 
<row> 
    <urlSegment>curvy-simplicity</urlSegment> 
    <shortenedUrlSegment>65546</shortenedUrlSegment> 
</row> 

и т.д.

Вывод, который я хочу, это таблица с двумя столбцами (URL и ShortenedUrl) с данными сцепленных в URL-адрес моды как показано ниже.

Url         | ShortenedUrl 
electronics/phones/curvy-simplicity | 0x58/0x5AC0/65546 

и т.д.

Может кто-нибудь помочь?

Лучшее относительно

ответ

3

вы можете использовать XQuery, как это:

select 
    stuff(
     @data.query(' 
      for $i in row/urlSegment return <a>{concat("/", $i)}</a> 
     ').value('.', 'varchar(max)') 
    , 1, 1, '') as Url, 
    stuff(
     @data.query(' 
      for $i in row/shortenedUrlSegment return <a>{concat("/", $i)}</a> 
     ').value('.', 'varchar(max)') 
    , 1, 1, '') as ShortenedUrl 

sql fiddle demo

+1

Даже я думал, что больше не использую XML, это прекрасно работает. Благодарю. – dezzy

+0

Делал это еще один способ, который не обрабатывал бы несколько подгрупп строк для конкатенации, и это полностью решило проблему. Гораздо чище, чем раньше. Благодаря! – LikeableBias

1

Попробуйте это:

DECLARE @input XML 

SET @input = '<row> 
    <urlSegment>electronics</urlSegment> 
    <shortenedUrlSegment>0x58</shortenedUrlSegment> 
</row> 
<row> 
    <urlSegment>phones</urlSegment> 
    <shortenedUrlSegment>0x5AC0</shortenedUrlSegment> 
</row> 
<row> 
    <urlSegment>curvy-simplicity</urlSegment> 
    <shortenedUrlSegment>65546</shortenedUrlSegment> 
</row>' 

SELECT 
    Url = XRow.value('(urlSegment)[1]', 'varchar(100)'), 
    ShortenedUrl =XRow.value('(shortenedUrlSegment)[1]', 'varchar(100)') 
FROM 
    @input.nodes('/row') AS XTbl(XRow) 

.nodes() дает последовательность фрагментов XML, по одному для каждого <row> узла в вашем XML. Затем вы можете «дотянуться» до элемента <row> и выловить содержащиеся подэлементы.

+0

Это заставляет меня 1/2 пути там, но мне нужно, чтобы объединить каждую строку в каждом столбце, так что данные в обоих столбцы были бы (Url) электроника/телефоны/curvy-simplicity & (UrlShortened) 0x58/0x5AC0/65546 – dezzy