SQL Server 2008 Shredding XML - PullRequest
       5

SQL Server 2008 Shredding XML

3 голосов
/ 03 февраля 2012

Привет, у меня есть такой XML-код ...

<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>

Я хотел бы вернуть A, B, C.Я видел несколько похожих вопросов, но у них было одно и то же имя повторяющегося узла.К сожалению, на данном этапе я не могу это изменить.Я играл с синтаксисом SQL Xpath для AGES, но не повезло.Я могу получить весь узел вопросов, но в идеале я хотел бы получить фактические данные.Несколько возвращенных строк также будет в порядке.

Любая помощь будет принята с благодарностью.

Обновление - ответ Кирилла очень близок, за исключением того, что у меня более 1 записи в таблице, и она возвращает данные всех записей в пределах 1 строки.Если бы я мог получить файл строки / XML, который был бы идеальным!Либо путем вывода другого поля из этой записи, например, rownum, либо вывода другого фрагмента данных из файла, например ProfileName.

спасибо,

Адриан!

Ответы [ 4 ]

5 голосов
/ 03 февраля 2012
declare @x xml = N'<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>
'

SELECT x.value('.','varchar(10)')
FROM @x.nodes('/Questions/*') x(x)

выход

----------
A
B
C
2 голосов
/ 03 февраля 2012

Продолжаем решение Мартина и вдохновляемся этим :

declare @x xml = N'<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>
'

DECLARE @Questions VARCHAR(MAX)

SELECT @Questions = COALESCE(@Questions + ', ', '') + Question
FROM (
    SELECT x.value('.','varchar(10)') as Question
    FROM @x.nodes('/Questions/*') x(x)
) as y

SELECT @Questions

Выход:

A, B, C
1 голос
/ 03 февраля 2012

Использование:

declare @x xml ='
<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>'

select @x.value('(/*/Question1)[1]', 'nvarchar(max)')
    , @x.value('(/*/Question2)[1]', 'nvarchar(max)')
    , @x.value('(/*/Question3)[1]', 'nvarchar(max)')

Выход:

---- ---- ----
A    B    C
0 голосов
/ 03 февраля 2012
select stuff(
(
    select ',' + x.value('.', 'varchar(10)') [text()]
    from @x.nodes('/*/*') x(x)
    for xml path(''))
, 1, 1, '')

Выход:

A,B,C
...