我正在使用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 <p>This is the first Message</p><p>This is the second Message</p>
我上面的代码的问题是,所有内容都变成了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>
答案 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>