将多个html行合并为一个

时间:2018-03-16 18:44:18

标签: sql sql-server sql-server-2012

我正在使用SQL Server 2012,我有以下两个表

博客

Id Title
1  My Blog Title

BlogContent

Id Blogid Content
1    1   <p>My First Paragraph</p>
2    1   <p>My Second Paragraph</p>

每个博客条目可能包含多个内容条目。这是一个包含HTML内容的varchar字段。我需要选择一个博客及其所有内容组合在一起。

这是我试过的:

SELECT B.Id, B.Title, 
STUFF(( SELECT '' + BC.Content 
        FROM BlogContent BC 
        WHERE B.Id = BC.Blogid
        ORDER BY BC.Id ASC OFFSET 0 ROWS
        FOR XML PATH('')),1,0,'') AS Content
FROM Blog B
WHERE B.Id = 1
ORDER BY B.PublishDate DESC

它几乎奏效,这是我的结果:

Id   Title             Content
1    My Blog Title     &lt;p&gt;This is the first Message&lt;/p&gt;&lt;p&gt;This is the second Message&lt;/p&gt;

我上面的代码的问题是,所有内容都变成了HTML编码,我认为它是因为FOR XML。如何在不添加此部件的情况下实现组合?如果我不添加它,那么我会收到错误。

  

子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;,&gt; =或子查询用作表达式时,不允许这样做。

如何获得以下结果:

Id   Title             Content
1    My Blog Title     <p>This is the first Message</p><p>This is the second Message</p>

1 个答案:

答案 0 :(得分:2)

假设BlogContent中的ID是正确的序列。

示例

Declare @Blog table (ID int, Title varchar(max))
Insert Into @Blog values
(1,'My Blog Title')

Declare @BlogContent table (ID int,Blogid int, Content varchar(max))
Insert Into @BlogContent values
(1,1,'<p>My First Paragraph</p>'),
(2,1,'<p>My Second Paragraph</p>')


Select A.*
      ,Content  = Stuff((Select '' +Content 
                           From  @BlogContent 
                           Where Blogid=A.ID 
                           Order by ID 
                           For XML Path(''),TYPE).value('(./text())[1]','varchar(max)')
                        ,1,0,'') 
 From @Blog A

<强>返回

ID  Title           Content
1   My Blog Title   <p>My First Paragraph</p><p>My Second Paragraph</p>