使用for json子句把查詢結果作爲json字符串導出,將作爲sql server 2016中首先可用的一個特性。如果你熟悉for xml子句,那麼將很容易理解for json:
select ccolumn, expression, column as alias from table1, table2, table3 for json [auto | path]
如果你把for json子句添加到T-SQL Select查詢語句的最後,SQL Server將會把結果格式化爲JSON字符串之後在返回到客戶端。每一行數據將會格式化爲一個json對象,每一個數據字段將會成爲行對象的值,列名或者列的別名會作爲行對象的鍵。我們有兩種類型的for json子句:
FOR JSON Path,通過列名或者列別名來定義JSON對象的層次結構,列別名中可以包含“.”,JSON的成員層次結構將會與別名中的層次結構保持一致。
這個特性非常類似於早期SQL Server版本中的For Xml Path子句,可以使用斜線來定義xml的層次結構。FOR JSON Auto,自動按照查詢語句中使用的表結構來創建嵌套的JSON子數組,類似於For Xml Auto特性。
如果你用過PostgreSQL中涉及到JSON的函數和操作符,你會注意到,FOR JSON子句類等價於PostgreSQL中的JSON創建函數比如row_to_json或json_object。FOR JSON子句的主要目的是根據JSON規範把變量、列格式化爲JSON對象。比如:
set @json = (select 1 as firstKey, getdate() as dateKey, @someVar as thirdKey for json path)-- result is : {"firstKey": 1, "dateKey": "2016-06-15 11:35:21", "thirdKey": "Content of variable"}
FOR JSON子句主要應用場景:
把需要返回給客戶端的一組對象序列化爲JSON。想象一下,在你創建JSON Web服務的時候,需要提供供應商信息及其產品信息(比如在OData服務中使用$extend選項)。你可能會查詢供應商列表,把每個供應商信息格式化爲JSON對象並通過額外查詢來獲得這個供應商的產品列表,將其轉化爲JSON對象數組附加到供應商對象。其他方案可能會通過鏈接查詢來獲得供應商和產品信息列表,使用客戶端代碼來格式化爲JSON對象(若使用Entity Framework將可能產生額外查詢)。使用for json子句,你可以連接這兩個表進行查詢,添加你想要的前綴(定義JSON層次結構),在數據庫層完成JSON格式化工作。
在一對多的父子表關係場景,你不想創建子表,而是想把子表的記錄以JSON數組的格式存儲作爲父表的一列。比如你不想把SalesOrderHeader和SalesOrderDetails數據分成兩個表來保存,你可以把每個訂單的多個商品詳情格式化爲JSON數組保存到SalesOrderHeader表中的一列。