admin

将多个html行合并为一个

sql

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

博客

Id Title
1  My Blog Title

博客内容

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

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

这是我尝试过的:

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个以上的值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

如何获得以下结果:

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

阅读 338

收藏
2021-07-01

共1个答案

admin

假定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>
2021-07-01