以高效的方式加入多个'for XML'输出

时间:2011-05-18 08:35:28

标签: sql-server xml performance

在下面的代码中,我将两个独立select子句的xml输出加入到一个XML中。

create procedure Test
as

declare @result nvarchar(max)

set @result = '<data>'
set @result = @result + (select FieldA from Table1 for xml raw('a'), root('table1'))
set @result = @result + (select FieldB from Table2 for xml raw('b'), root('table2'))
set @result = @result + '/<data>'

return @result

输出如下:

<data>
    <table1>
        <a FieldA="01"/>
        <a FieldA="02"/>
    </table1>
    <table2>
        <b FieldB="aa"/>
        <b FieldB="bb"/>
    </table2>
</data>

我想知道是否有更好的方法来实现更高性能的上述输出。

我相信'for xml'输出(xml数据类型)是流式传输而nvarchar不是。那么,输出XML数据类型是否有益?或者,Xml数据类型开销(解析,良好性检查等)是否会超过nvarchar数据类型的流式传输优势?

编辑 ASP.Net应用程序将调用该过程,并通过ADO.Net类读取结果

1 个答案:

答案 0 :(得分:1)

可以将子查询中的xml组合成更大的xml结果。关键是使用sqlserver xml类型。

with foodata as (
  select 1 as n
  union all
  select n+1 from foodata where n < 20
)
select
  (select n as 'text()' from foodata where n between 10 and 13 for xml path('row'), root('query1'), type),
  (select n as 'text()' from foodata where n between 15 and 18 for xml path('row'), root('query2'), type)
for xml path('root'), type

上面的查询将生成以下输出:

<root>
  <query1>
    <row>10</row>
    <row>11</row>
    <row>12</row>
    <row>13</row>
  </query1>
  <query2>
    <row>15</row>
    <row>16</row>
    <row>17</row>
    <row>18</row>
  </query2>
</root>

我不能说哪个更快。你只需要做一些基准测试。