我有以下查询确实会降低性能,并且想知道它们是 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 '&bull; ' +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/> &bull; this note is really long.  <br/> &bull This is fun <br/>
    2    | <br/><br/> &bull; This is not fun.  <br/>
    3    | <br/><br/> &bull; long note here.   <br/>

最佳答案

我认为如果跳过外部查询中的 distinct 并改为执行 group by p_c_id,您会获得稍微好一点的性能。

select p_c_id,
      '<br/><br/>'+(select distinct '&bull; ' +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/

10-16 08:50