2015-12-08 3 views
3

дали данные XML типизированного столбец х в таблице у со значениями, такими как:T-SQL XQuery для возвращения результата строки для каждого, соответствующего значению XML для каждого вложенного элемента

<a> 
<b> 
<c>1</c> 
<c>2</c> 
<c>3</c> 
</b> 
</a> 

Как можно получить набор результатов с T-SQL XQuery, так что одна строка возвращается за <c> значение элемента? Предположим, что таблица y также имеет столбец z, который содержит число <c> элементов в столбце x - просто у нас есть дополнительный столбец для возврата.

Лучшее, что мы могли придумать до сих пор было:

select 
z, 
cvalues = x.query('data(a/b/c)') 
from y 

выше, однако, будет возвращать одну строку для каждой строки в у и есть белый список разделенных пробелами значений для <c> элементов в cvalues ​​колонке ,

Как мы можем получить набор результатов, таких как:

z cvalues 
3 1 
3 2 
3 3 

вместо того, что мы получаем в настоящее время:

z cvalues 
3 1 2 3 

Спасибо!

ответ

3

Вы можете использовать CROSS APPLY в сочетании с nodes:

SELECT 
    z, 
    cvalues = s.c.value('.', 'int') 
FROM y 
CROSS APPLY x.nodes('//c') AS s(c); 

LiveDemo

Выход:

╔═══╦═════════╗ 
║ z ║ cvalues ║ 
╠═══╬═════════╣ 
║ 3 ║  1 ║ 
║ 3 ║  2 ║ 
║ 3 ║  3 ║ 
╚═══╩═════════╝ 

Имейте в виду, что:

//c матч все c XML элемент независимо от того, где он находится в иерархии

/a/b/c будет соответствовать c XML-элемент, который вложен в a и b

+0

Очень хорошо! Добавлен бонус для части на совпадение. Взволнован, чтобы узнать больше XQuery: кажется, что это может быть очень полезно. –

Смежные вопросы