Sql-Server

使用 SELECT FOR JSON 生成包含點的屬性名稱的 JSON

  • May 6, 2022

我需要從 SQL Server 中的表生成以下 JSON 有效負載(縮短)。請注意屬性名稱中的點。這是一種稱為 OData 的特殊語法。

{
 "Id" : "A1",
 "value": {
   "createdonbehalfby@odata.bind": "systemusers(key='AAAA12334')"
 }
}

想像一下表格如下:

我嘗試了以下 T-SQL 命令:

SELECT [Id], [CreatedBy] AS [value.createdonbehalfby@odata.bind]
FROM [Account]
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

這顯然會導致:

{
 "Id" : "A1",
 "value": {
   "createdonbehalfby@odata": {
     "bind": "systemusers(key='AAAA12334')"
   }
 }
}

我已經徹底閱讀了有關 SQL Server 中 JSON 功能的完整文件,並且在文件中沒有描述屬性名稱中的轉義點。

您可以使用FOR JSON AUTOwhich 忽略.鍵中的字元。

這種情況下需要放在子查詢中,否則無法獲取valuekey

SELECT
 [Id],
 JSON_QUERY((
   SELECT
     [CreatedBy] AS [createdonbehalfby@odata.bind]
   FROM (VALUES(1)) v(dummy)   -- because AUTO needs at least one table
   FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
 )) AS value
FROM [Account]
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER```

db<>小提琴

一種解決方案(除了我的其他答案)是在您希望生成的 JSON 結構中更加明確。基本上,您在這里為 FOR JSON 提供了一些已經正確解析的 JSON 程式碼。

SELECT
   [Id], 
   JSON_QUERY('{"createdonbehalfby@odata.bind":"'+CreatedBy+'"}') as value
FROM (SELECT 'A1'  as ID, 'AAAA12334' as CreatedBy) AS account
FOR JSON PATH , without_array_wrapper

此解決方案保留 FOR JSON 生成的列名。MS SSMS 螢幕截圖

引用自:https://dba.stackexchange.com/questions/311715