2013-03-21 46 views
0

我有以下SQLSQL Server for xml返回自定義xml格式?

with X(x) as (select 'a' union select 'b') 
    , Y(y) as (select 1 union select 2 union select 3) 
select x, y from X cross join Y 
for xml path('') 

,並返回

<x>a</x> 
<y>1</y> 
<x>a</x> 
<y>2</y> 
<x>a</x> 
<y>3</y> 
<x>b</x> 
<y>1</y> 
<x>b</x> 
<y>2</y> 
<x>b</x> 
<y>3</y> 

是否有可能使其返回

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

<x v="a"><y>1</y><y>2</y><y>3</y></x> 
<x v="b"><y>1</y><y>2</y><y>3</y></x> 

也許我應該使用xquery FLWOR進行排列?

回答

6

如果使用這樣的:

WITH X(x) AS (SELECT 'a' UNION SELECT 'b') 
    , Y(y) AS (SELECT 1 UNION SELECT 2 UNION SELECT 3) 
SELECT 
    x AS "@v", 
    (SELECT y FROM Y 
    FOR XML PATH(''), TYPE) 
FROM X 
FOR XML PATH('X') 

你應該得到的輸出:

<X v="a"> 
    <y>1</y> 
    <y>2</y> 
    <y>3</y> 
</X> 
<X v="b"> 
    <y>1</y> 
    <y>2</y> 
    <y>3</y> 
</X> 

我不知道的任何方式使用列(a)作爲價值XML輸出中的XML標記(<a>......</a>)。

+2

+1:尼斯和清潔。 – 2013-03-21 18:21:47

0

這裏查詢第一個結果。

select cast('<'+x+'>' + 
       (
       select y 
       from Y 
       for xml path('') 
       ) + 
      '</'+x+'>' 
     as xml) 
from X 
for xml path('') 

這是一個有點冒險,因爲x所有的值必須是有效的XML元素名稱。

1

你可以試試這個讓你的第一個結果集

create table #t1(id int) 

insert into #t1 
select 1 union select 2 union select 3 

create table #row(ch char(1)) 
insert into #row 
select 'a' union select 'b' 

select cast ((
select(
select 

'<' + cast(ch as varchar(max)) + '>', 
(
select(
CAST(
(select id as 'Y' from #t1 
for xml path(''), type 
)as varchar(max) 
) 
) 
) 
, 
'</' + cast(ch as varchar(max)) + '>' 
from #row 
for xml path(''),root('root'), type 
).value('/root[1]','varchar(max)') 
) as xml)