0

我有以下 SQL

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 进行排列?

4

3 回答 3

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>

于 2013-03-21T17:56:47.143 回答
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)
于 2013-03-21T19:41:38.833 回答
0

这里查询第一个结果。

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

这有点冒险,因为其中的所有值x都必须是有效的 XML 元素名称。

于 2013-03-21T17:58:59.570 回答