我正在使用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内容的字段。我需要选择一个博客,并将其所有内容组合在一起。
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 <p>This is the first Message</p><p>This is the second Message</p>
我上面的代码的问题是,一切都变成了HTML编码,我认为是因为FOR XML。如何在不添加此部分的情况下实现合并?如果不添加,则会出现错误。
FOR XML
子查询返回了1个以上的值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
如何获得以下结果:
Id Title Content 1 My Blog Title <p>This is the first Message</p><p>This is the second Message</p>
假定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>