Как объединить данные из XML-запроса SQL Server?

У меня есть запрос SQL, который возвращает мне XML ниже

<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

так далее

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

С наилучшими пожеланиями


person dezzy    schedule 18.09.2013    source источник


Ответы (2)


вы можете использовать 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

person Roman Pekar    schedule 03.10.2013
comment
Даже если я больше не использую XML, это прекрасно работает. Спасибо. - person dezzy; 06.11.2013
comment
Делал это другим способом, который не обрабатывал несколько подгрупп строк для объединения, и это полностью решило проблему. Также гораздо чище, чем раньше. Спасибо! - person LikeableBias; 10.12.2015
comment
Абсолютно прекрасно! - person Tony Sepia; 07.08.2019

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

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> и извлечь содержащиеся в нем подэлементы.

person marc_s    schedule 18.09.2013
comment
Это дает мне 1/2 пути, но мне нужно объединить каждую строку в каждом столбце, чтобы данные в обоих столбцах были (Url)electronics/phones/curvy-simplicity & (UrlShortened) 0x58/0x5AC0/65546 - person dezzy; 18.09.2013