使用 WITHOUT_ARRAY_WRAPPER 返回奇數數據的 JSON 子查詢?
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')