我在 SQL 中有以下表格(下面的偽名稱),我需要使用這些表格從以下表格中生成一些動態 JSON:
表頭表
RequestID int
RequestType varchar(50)
樣本資料
1 : User Name Change
2 : User Name Change
值表
RequestID int
Alias varchar(50)
FieldValue varchar(50)
樣本資料
1 : MobileNo : 07777777777
1 : Name : Fred Bloggs
2 : MobileNo : 07888888888
2 : Name : John Smith
我最終需要的 JSON 如下:
[
{
"request_type":"User Name Change",
"request_details":[
{
"MobileNo":"07777777777",
"Name":"Fred Bloggs"
},
{
"MobileNo":"07888888888",
"Name":"John Smith"
}
]
}
]
所以我實際上需要將我的別名值作為 JSON 中的鍵名傳遞。
到目前為止,我的代碼如下,但我認為我可能需要某種動態 SQL?
SELECT hdr.RequestType AS request_type
, (
SELECT vals.FieldValue AS [request_details.value]
FROM ValuesTable vals
WHERE vals.RequestID = hdr.[RequestID]
FOR JSON PATH
) request_details
FROM HeaderTable hdr
FOR JSON PATH
我不確定其他 SQL JSON 函式是否在這里有用,或者我是否需要以某種方式生成一些動態 SQL 作為我唯一的希望?
uj5u.com熱心網友回復:
我認為您不能直接構建所需的 JSON (usinf FOR JSON),但您可以嘗試使用基本的字串連接和聚合來構建 JSON 輸出的一部分。請注意,從 SQL Server 2016 開始,您需要FOR XML PATH用于聚合:
資料:
SELECT *
INTO HeaderTable
FROM (VALUES
(1, 'User Name Change')
) v (RequestID, RequestType)
SELECT *
INTO ValuesTable
FROM (VALUES
(1, 'MobileNo', '07777777777'),
(1, 'Name', 'Fred Bloggs'),
(1, 'Address', 'Full address'),
(2, 'MobileNo', '07888888888'),
(2, 'Name', 'John Smith')
) v (RequestID, Alias, FieldValue)
SQL Server 2017 的宣告:
SELECT
hdr.RequestType AS request_type,
JSON_QUERY((
SELECT CONCAT(
'[{',
STRING_AGG(
CONCAT(
'"',
STRING_ESCAPE(vals.Alias, 'json'),
'":"',
STRING_ESCAPE(vals.FieldValue, 'json'), '"'
),
','
),
'}]'
)
FROM ValuesTable vals
WHERE vals.RequestID = hdr.[RequestID]
)) AS request_details
FROM HeaderTable hdr
FOR JSON PATH
SQL Server 2016 的宣告:
SELECT
hdr.RequestType AS request_type,
JSON_QUERY(CONCAT(
'[{',
STUFF(
(
SELECT CONCAT(',"', vals.Alias, '":"', vals.FieldValue, '"')
FROM ValuesTable vals
WHERE vals.RequestID = hdr.[RequestID]
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)'),
1, 1, ''
),
'}]'
)) AS request_details
FROM HeaderTable hdr
FOR JSON PATH
結果:
[
{
"request_type":"User Name Change",
"request_details":[
{
"MobileNo":"07777777777",
"Name":"Fred Bloggs",
"Address":"Full address"
}
]
}
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410550.html
標籤:
上一篇:從當年的周數中減去N
