json - SQL Server 的 JSON 输出格式
问题描述
我昨天发布了一个关于这个的问题,解决方案主义者非常有帮助地回答了这个问题,但我现在有一个类似的后续问题。
我想从 JSON 中获取两组数据。
我有三个数据集,一个是标题,一个是一组客户记录,最后一个是错误对象。我想要尝试得到的结构是:Header Customers Error
但我得到的是:标题客户,错误客户,错误
现在在这个例子中,错误是空的,所以我很高兴错误被忽略,因为它是空的,或者作为一个空对象返回,但我想要一个,而不是每个客户一个。
这是我目前得到的:
select isjson('{"APIResult":[{"ID":200,
"Status_Message":"Success",
"Developer_Message":"Customers found",
"User_Message":"Customers found",
"Return_Code":0,
"Customer":[{"ID":"A6B10FA0-85AD-422D-8A7E-07EEA541593E",
"First_Name":"Bbb",
"Paternal_Last_Name":"Bbbbb",
"Email_Address":"bbbb@example.com",
"Error":[{}]
},
{"ID":"91EE2FD6-2C40-4CFD-ABB7-2CDAE3624487",
"First_Name":"Aaaa",
"Paternal_Last_Name":"Aaaaa",
"Email_Address":"aaaaa@example.com",
"Error":[{}]
}]
}]
}')
这就是我想要得到的:
select isjson('{"APIResult":[{"ID":200,
"Status_Message":"Success",
"Developer_Message":"Customers found",
"User_Message":"Customers found",
"Return_Code":0,
"Customer":[{"ID":"A6B10FA0-85AD-422D-8A7E-07EEA541593E",
"First_Name":"Bbb",
"Paternal_Last_Name":"Bbbbb",
"Email_Address":"bbbb@example.com"
},
{"ID":"91EE2FD6-2C40-4CFD-ABB7-2CDAE3624487",
"First_Name":"Aaaa",
"Paternal_Last_Name":"Aaaaa",
"Email_Address":"aaaaa@example.com"
}],
"Error":[{}]
}]
}')
两者都是有效的 JSON(我这次已经测试过了,如您所见),但我不知道如何获得第二种格式。
这是我正在运行以获取输出的查询:
declare @returncode int = 0
,@VerboseMsg nvarchar(4000) = 'Customers found'
,@DisplayMsg nvarchar(4000) = 'Customers found'
CREATE TABLE #Customers (CustomerID UNIQUEIDENTIFIER DEFAULT(NEWID()), FirstName NVARCHAR(50), PaternalLastName NVARCHAR(50), EmailAddress NVARCHAR(250))
INSERT INTO #Customers (FirstName, PaternalLastName, EmailAddress)
VALUES ('Aaaa', 'Aaaa', 'aaaa@example.com'), ('Bbbb', 'Bbbb', 'bbbb@example.com')
SELECT st.APIStatus AS 'ID'
,st.StatusMessage AS 'Status_Message'
,@VerboseMsg AS 'Developer_Message'
,@DisplayMsg AS 'User_Message'
,st.ReturnCode AS 'Return_Code'
,[Customer].CustomerID AS 'ID'
,[Customer].FirstName AS 'First_Name'
,[Customer].PaternalLastName AS 'Paternal_Last_Name'
,[Customer].EmailAddress AS 'Email_Address'
,[Error].ErrorCode AS 'Error_Code'
,[Error].ErrorMsg AS 'Error_Message'
FROM (SELECT 200 AS APIStatus, 'Success' AS StatusMessage, @ReturnCode AS ReturnCode) st
LEFT JOIN (SELECT CustomerID
,FirstName
,PaternalLastName
,EmailAddress
,@ReturnCode AS ReturnCode
FROM #Customers
) As [Customer]
ON st.ReturnCode = [Customer].ReturnCode
LEFT JOIN (SELECT @ReturnCode AS ErrorCode, @DisplayMsg AS ErrorMsg WHERE @returncode != 0) AS [Error]
ON [Error].ErrorCode = st.ReturnCode
FOR JSON AUTO, ROOT('APIResult')
是不是我能得到这个输出的唯一方法就是自己把东西拼接在一起?JSON 对我来说仍然很新,我正在努力掌握它的构成。
解决方案
在此设置中,我将在返回代码之后放置错误代码,并将使用带有 JSON PATH 的子查询,如下所示:
SELECT st.APIStatus AS 'ID'
,st.StatusMessage AS 'Status_Message'
,@VerboseMsg AS 'Developer_Message'
,@DisplayMsg AS 'User_Message'
,st.ReturnCode AS 'Return_Code'
, (SELECT @ReturnCode AS ErrorCode, @DisplayMsg AS ErrorMsg FOR JSON PATH) AS [Error]
,[Customer].CustomerID AS 'ID'
,[Customer].FirstName AS 'First_Name'
,[Customer].PaternalLastName AS 'Paternal_Last_Name'
,[Customer].EmailAddress AS 'Email_Address'
FROM (SELECT 200 AS APIStatus, 'Success' AS StatusMessage, @ReturnCode AS ReturnCode) st
LEFT JOIN (SELECT CustomerID
,FirstName
,PaternalLastName
,EmailAddress
,@ReturnCode AS ReturnCode
FROM #Customers
) As [Customer]
ON st.ReturnCode = [Customer].ReturnCode -- why?
FOR JSON AUTO, ROOT('APIResult')
请注意,如果您在 Error 中没有任何记录,它将被省略,但您可以在这种情况下使用 null,我还注意到您使用了两次 @ReturnCode,我不知道这是故意还是错误。
推荐阅读
- c++ - C ++:具有成员字段作为地址的用户定义类
- angular - 当我 console.log 类它返回 null
- javascript - abc.filter().map() ==> to reduce() 应该怎么用?JavaScript
- node.js - Watson-discovery 和 Nodejs:我的查询没有得到预期的答案
- python-3.x - 过滤同时借给借款人但不在同一笔贷款中的一对贷方
- python - 使用 python 读取 CSV 文件时打印特定元素
- javascript - 如何使用javascript自动填写新标签中密码字段的值?
- visual-studio-code - Visual Studio Code - 使快捷方式仅在编辑器焦点中运行
- javascript - 增加函数内部的全局变量
- c++ - CuDNN 减少格式错误