将多行XML数据合并为一个XML值(SQL Server)

时间:2017-08-30 18:25:03

标签: sql sql-server xml for-xml

我有一个包含两列的表(DataXML是xml数据类型):

 RowID DataXML
 ––––– –––––––––––––––––––––––––––
 1     <ELEM FOO="11" BAR="A" />
 2     <ELEM FOO="22" BAR="B" />
 3     <ELEM FOO="33" BAR="C" />
 4     <ELEM FOO="44" BAR="D" />

我想编写一个类似这样的T-SQL语句:

declare @MyXML xml;
set @MyXML = (
   SELECT  DataXML
   FROM    MyTable
   WHERE   RowID BETWEEN 2 AND 3
   FOR     XML ??????
);

并在@MyXML中结束本文档:

<ROOT>
  <ELEM FOO="22" BAR="B" />
  <ELEM FOO="33" BAR="C" />
</ROOT>

如何编写set @MyXML = ...语句的查询以获得我想要的结果?

感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:2)

没有列别名的子选择不会将其结果包装在XML元素中:

declare @data table (
    [RowID] int not null
  , [DataXML] xml not null
);

insert into @data ([RowID], [DataXML])
values (1, N'<ELEM FOO="11" BAR="A" />')
     , (2, N'<ELEM FOO="22" BAR="B" />')
     , (3, N'<ELEM FOO="33" BAR="C" />')
     , (4, N'<ELEM FOO="44" BAR="D" />');

select (
           select (select a.[DataXML])
           from @data as a
           where a.RowID between 2 and 3
           for xml path(''), type
       )
for xml path('ROOT'), type;

返回:

<ROOT>
    <ELEM FOO="22" BAR="B" />
    <ELEM FOO="33" BAR="C" />
</ROOT>