Sql-Server

使用 WITHOUT_ARRAY_WRAPPER 返回奇數數據的 JSON 子查詢?

  • August 14, 2018

SQL Server 2016,我正在嘗試使用一些正常數據並返回一個 JSON 對像以供另一個系統處理。另一個系統無法辨識數組包裝器,因此我嘗試使用 WITHOUT_ARRAY_WRAPPER 來擺脫它。在子查詢中使用時,會返回奇怪的結果…

SELECT @@SERVERNAME AS [Servername],
( SELECT [Name], [Recovery_Model_Desc]  
   FROM sys.databases
   WHERE name in ('master', 'model', 'msdb')
   FOR JSON PATH
   ) AS d
FOR JSON PATH, ROOT('ServerInformation')

這會產生預期的數據,使用數組包裝器……

{“伺服器資訊”:

$$ {“Servername”:“MyServer”,“d”:[{“Name”:“master”,“Recovery_Model_Desc”:“SIMPLE”},{“Name”:“model”,“Recovery_Model_Desc”:“FULL”},{“Name”:“msdb”,“Recovery_Model_Desc”:“SIMPLE”}]} $$}

但是, WITHOUT_ARRAY_WRAPPER 會產生…

SELECT @@SERVERNAME AS [Servername],
( SELECT [Name], [Recovery_Model_Desc]  
   FROM sys.databases
   WHERE name in ('master', 'model', 'msdb')
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
   ) AS d
FOR JSON PATH, ROOT('ServerInformation')

{“伺服器資訊”:

$$ {“Servername”:“MyServer”,“d”:"{"Name":"master","Recovery_Model_Desc":"SIMPLE"},{"Name":"model","Recovery_Model_Desc":"FULL"},{"Name":"msdb","Recovery_Model_Desc":"SIMPLE"}"} $$}

而我希望它會產生

{“ServerInformation”:{“Servername”:“MyServer”,“d”:{“Name”:“master”,“Recovery_Model_Desc”:“SIMPLE”},{“Name”:“model”,“Recovery_Model_Desc”:" FULL"},{“Name”:“msdb”,“Recovery_Model_Desc”:“SIMPLE”}}}

錯誤或預期結果?

編輯:調整預期結果

引入該功能時有一篇部落格文章說:

如果您想要一個對象,則需要在腳本中添加 WITHOUT_ARRAY_WRAPPER,

$$ … $$WITHOUT_ARRAY_WRAPPER 不會生成有效的 JSON 文本,$$ … $$會將 NestedJson 視為任何其他純文字轉義它並用雙引號括起來。

文章本身有點混亂和破碎,但我對此的解讀是,它僅用於單行結果,因此嵌套的 JSON 將被視為字元串。

使用 json_query,

SELECT @@SERVERNAME AS [Servername],
json_query(( SELECT [Name], [Recovery_Model_Desc]  
   FROM sys.databases
   WHERE name in ('master', 'model', 'msdb')
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
   ) ) AS d
FOR JSON PATH, ROOT('ServerInformation')

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