编辑:FYI。所以我的PrimaryImage实际上是一个int,并且被用作我的Images表的外键。我只是想解释一下,这样清楚为什么我将它设置为
这是我的存储过程。
on f.PrimaryImage = i.Id
。由于某种原因,所有的行都会填充每个i.Id、i.EntityId、i.ImageTypeId和i.ImageUrl,而不仅仅是我的f.PrimaryImage = i.Id。
我正在编写一个SQL存储过程来选择所有内容,我想将我的最后4列 Id,EntityId,ImageTypeId,ImageUrl
合并为一个新列 PrimaryImage
作为单个JSON对象。我已经成功地对我的Skills列进行了操作,但是为此我需要它作为包含JSON对象的数组,因此只需使用 "FOR JSON AUTO"
就可以解决这个问题。但是像我所说的那样,对于 PrimaryImage
,我需要将其作为包含我的 Id,EntityId,ImageTypeId 和 ImageUrl
的单个JSON对象。我在执行此过程后包含了我的结果图片,并在我的表格正下方画了我希望该列看起来像什么的表示。为了澄清,我有四个表,我的Friends、FriendSkills、Skills和Images表,我已经使用连接语句进行了组织。基本上,我的模式应该看起来像这样:
{
"id": 0000,
"userId": "String"
"bio": "String",
"title": "String",
"summary": "String",
"headline": "String",
"statusId": "String",
"slug": "String",
"skills": [{id: 0, name: "String"},{id: 0, name: "String"}],
"primaryImage": {
"id": 0,
"entityId": 0,
"imageTypeId": 0,
"imageUrl": "String"
}
}
这是我的存储过程。
ALTER PROC [dbo].[Friends_SelectAllV2]
AS
/* --- Test Proc ------
Execute dbo.Friends_SelectAllV2
*/
BEGIN
Select f.Id
,f.UserId
,f.DateAdded
,f.DateModified
,f.Title
,f.Bio
,f.Summary
,f.Headline
,f.Slug
,f.StatusId
,Skills = ( SELECT s.Id,
s.Name
From dbo.Skills as s inner join dbo.FriendSkills fs
on s.Id = fs.SkillId
Where f.Id = fs.FriendId
FOR JSON AUTO
),
PrimaryImage = (SELECT i.Id,
i.EntityId,
i.ImageTypeId,
i.ImageUrl
From dbo.Friends f left join dbo.Images as i
on f.PrimaryImage = i.Id
Where f.PrimaryImage = i.Id
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
END
primaryImage
列执行相同的操作。 - Zhorovwithout_array_wrapper
。 - AlwaysLearningprimaryImage = (SELECT i.Id、i.EntityId、i.ImageTypeId、i.ImageUrl FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
),我只是错过了WITHOUT_ARRAY_WRAPPER
的解释。但可能存在一个问题,那就是URL的转义。我将其发布为评论,因为stackoverflow.com上有许多关于同样问题的问题。谢谢。 - Zhorov