2013-10-25 4 views
1
DECLARE @Data AS XML = ' 
<Catalog> 
<Artist> 
    <name>Wolfgang</name> 
    <name>Razorback</name> 
</Artist> 
<Album> 
    <Category>Rock</Category> 
    <Category>Alternative</Category> 
</Album> 
</Catalog>' 

SELECT 
    B.value('(text())[1]','varchar(15)') as Artist, 
    C.value('(text())[1]','varchar(15)') as Album 
FROM @Data.nodes('/Catalog') AS Catalog(A) 
    CROSS APPLY A.nodes('Artist/name') as Artist(B) 
    CROSS APPLY A.nodes('Album/Category') as Album(C) 

Я ожидал, что результат должен быть, как это, я действительно просто хотел сделать артиста в качестве первого Colum и альбома в качестве второго столбцаФорматирование XML в операторе отбора

enter image description here

но он вернулся этот запрос,

enter image description here

+0

Поскольку, в общем, нет никакой гарантии, что количество элементов '' и количество элементов '' совпадают, было бы замечательно, если бы он решил соединить их вместе. –

ответ

2

ваш XML не очень хорошо. Вы можете сделать это:

;with cte_artist as (
    select 
     row_number() over(order by (select '1')) as rn, 
     T.C.value('text()[1]','varchar(15)') as Artist 
    from @Data.nodes('/Catalog/Artist/name') as T(C) 
), cte_album as (
    select 
     row_number() over(order by (select '1')) as rn, 
     T.C.value('text()[1]','varchar(15)') as Album 
    from @Data.nodes('/Catalog/Album/Category') as T(C) 
) 
select 
    a1.Artist, 
    a2.Album 
from cte_artist as a1 
    full outer join cte_album as a2 on a2.rn = a1.rn 

sql fiddle demo

Но лучше всего было бы создать XML, как это (или любой другой вложенной, как вы хотите):

<Catalog> 
    <Album name="Rock album"> 
     <Category>Rock</Category> 
     <Artist name="Wolfgang"/> 
    </Album> 
    <Album name="Alternative album"> 
     <Category>Alternative</Category> 
     <Artist name="Razorback"/> 
    </Album> 
</Catalog> 

Так вы может запросить его следующим образом:

select 
    T.C.value('@name','varchar(15)') as name, 
    T.C.value('(Category/text())[1]','varchar(15)') as Category, 
    T.C.value('Artist[1]/@name','varchar(15)') as Artist 
from @Data.nodes('/Catalog/Album') as T(C) 

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

  • Нет связанных вопросов^_^