在下面的代码中,我将两个独立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类读取结果
答案 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>
我不能说哪个更快。你只需要做一些基准测试。