我有以下查询确实会降低性能,并且想知道它们是 xml 阅读器子查询的替代方案。此查询的目的是使用一些 html 代码导出数据。
表数据的示例如下。
p_s_id | p_c_id | notes
-----------------------
1 | 1 | this note is really long.
2 | 1 | This is fun.
3 | null | long note here
4 | 2 | this is not fun
5 | 2 | this is not fun
6 | 3 | long note here
我想记录所有具有相同 p_c_id 的不同笔记并将它们连接在一起,如下所示。
可以提供任何其他信息,因此请随时发表评论。
select distinct
p_c_id
,'<br/><br/>'+(select distinct '• ' +cast(note as nvarchar(max)) + ' <br/> '
from dbo.spec_notes_join m2
where m.p_c_id = m2.p_c_id
and isnull(note,'') <> ''
for xml path(''), type).value('.[1]', 'nvarchar(max)') as notes_spec
from dbo.spec_notes_join m
所以导出将如下所示:
p_c_id | notes
--------------
1 | <br/><br/> • this note is really long. <br/> &bull This is fun <br/>
2 | <br/><br/> • This is not fun. <br/>
3 | <br/><br/> • long note here. <br/>
最佳答案
我认为如果跳过外部查询中的 distinct
并改为执行 group by p_c_id
,您会获得稍微好一点的性能。
select p_c_id,
'<br/><br/>'+(select distinct '• ' +cast(note as nvarchar(max)) + ' <br/> '
from dbo.spec_notes_join m2
where m.p_c_id = m2.p_c_id and
isnull(note,'') <> ''
for xml path(''), type).value('.', 'nvarchar(max)') as notes_spec
from dbo.spec_notes_join m
group by p_c_id
您也可以尝试连接 CLR User-Defined Aggregate Function 。
其他替代方案可以在这里找到 Concatenating Row Values in Transact-SQL 。
关于tsql - 表值函数 [XML 阅读器] 非常慢 - 替代方案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7041015/