【SqlServer系列】JSON數據


1   概述

本文將結合MSDN簡要概述JSON數據。

2   具體內容

JSON 是一種流行的數據格式,用於在現代 Web 和移動應用程序中交換數據。 JSON 還可用於在 Microsoft Azure DocumentDB 等 NoSQL 數據庫中存儲非結構化數據。 許多 REST Web 服務以 JSON 文本格式返回結果,或接受采用 JSON 格式的數據。 例如,大多數 Azure 服務(如 Azure 搜索、Azure 存儲和 Azure DocumentDb)都提供返回或使用 JSON 的 REST 終結點。 JSON 也是用於通過 AJAX 調用在網頁與 Web 服務器之間交換數據的主要格式。

2.1  將 JSON 集合轉換為行集

 1 DECLARE @json NVARCHAR(MAX)
 2 SET @json =  
 3 N'[  
 4        { "id" : 2,"info": { "name": "John", "surname": "Smith" }, "age": 25 },  
 5        { "id" : 5,"info": { "name": "Jane", "surname": "Smith" }, "dob": "2005-11-04T12:00:00" }  
 6  ]'  
 7 
 8 SELECT *  
 9 FROM OPENJSON(@json)  
10   WITH (id int 'strict $.id',  
11         firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',  
12         age int, dateOfBirth datetime2 '$.dob')

 

2.2  將 SQL Server 數據轉換為 JSON 或導出 JSON

通過將 FOR JSON 子句添加到 SELECT 語句中,可將 SQL Server 數據或 SQL 查詢結果的格式設置為 JSON。 使用 FOR JSON 委托從客戶端應用程序到 SQL Server 的 JSON 輸出格式。 有關詳細信息,請參閱 借助 FOR JSON 將查詢結果的格式設置為 JSON (SQL Server)

以下示例使用 PATH 模式和 FOR JSON 子句。

1 SELECT id, firstName AS "info.name", lastName AS "info.surname", age, dateOfBirth as dob  
2 FROM People  
3 FOR JSON PATH

“應用程序池:” FOR JSON 子句將 SQL 結果的格式設置為 JSON 文本,該格式可提供給識別 JSON 的任何應用。 PATH 選項在 SELECT 子句中使用以點分隔的別名,以嵌套查詢結果中的對象。

2.3  合並關系數據和 JSON 數據

 SQL Server 提供混合模型,用於通過標准 Transact-SQL 語言存儲和處理關系數據與 JSON 數據。 可以將 JSON 文檔的集合組織到表中,在它們之間建立關系,將表中存儲的強類型標量列與 JSON 列中存儲的靈活鍵/值對合並,以及使用完整 Transact SQL 查詢一個或多個表中的標量值和 JSON 值。

JSON 文本通常存儲在 varchar 或 nvarchar 列中,並編制了純文本形式的索引。 任何支持文本的 SQL Server 功能或組件均支持 JSON,因此 JSON 和其他 SQL Server 功能之間的交互幾乎沒有任何約束。你可以將 JSON 存儲在內存中或臨時表中、對 JSON 文本應用行級別安全性謂詞等。

如果在單純的 JSON 工作負載中,你想要使用專用於處理 JSON 文檔的自定義查詢語言,可以考慮 Microsoft Azure DocumentDB

以下用例說明如何在 SQL Server中使用內置的 JSON 支持。

2.4 從格式化為 JSON 的 SQL Server 表返回數據

如果你的 Web 服務從數據庫層提取數據並以 JSON 格式返回數據,或者在接受已格式化為 JSON 的數據的 JavaScript 框架或庫中返回數據,則可以直接在 SQL 查詢中設置 JSON 輸出的格式。 你可以使用 FOR JSON 將 JSON 格式設置委托給 SQL Server,而非編寫代碼或者包含一個庫來轉換表格查詢結果對象,然后將對象序列化為 JSON 格式。

例如,你可能想要生成符合 OData 規范的 JSON 輸出。 Web 服務需要采用以下格式的請求和響應。

  • 請求: /Northwind/Northwind.svc/Products(1)?$select=ProductID,ProductName

  • 響應: {"@odata.context":"http://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity","ProductID":1,"ProductName":"Chai"}

    此 OData URL 代表針對 ID 為 1 的產品的 ProductID 和 ProductName 列的請求。 可以使用 FOR JSON 按 SQL Server 中所需的格式設置輸出格式。

1 SELECT 'http://services.odata.org/V4/Northwind/Northwind.svc/$metadata#Products(ProductID,ProductName)/$entity'
2  AS '@odata.context',   
3  ProductID, Name as ProductName   
4 FROM Production.Product  
5 WHERE ProductID = 1  
6 FOR JSON AUTO

此查詢的輸出是完全符合 OData 規范的 JSON 文本。 格式設置和轉義由 SQL Server 處理。 SQL Server 還可將查詢結果的格式設置為任何格式,如 OData JSON 或 GeoJSON - 有關詳細信息,請參閱 Returning spatial data in GeoJSON format(以 GeoJSON 格式返回空間數據)。

 2.5  使用 SQL 查詢分析 JSON 數據

如果必須篩選或聚合 JSON 數據以用於報告,可以使用 OPENJSON 將 JSON 轉換為關系格式。 然后,使用標准 Transact-SQL 和內置函數來准備報告。

 1 SELECT Tab.Id, SalesOrderJsonData.Customer, SalesOrderJsonData.Date  
 2 FROM   SalesOrderRecord AS Tab  
 3           CROSS APPLY  
 4      OPENJSON (Tab.json, N'$.Orders.OrdersArray')  
 5            WITH (  
 6               Number   varchar(200) N'$.Order.Number',   
 7               Date     datetime     N'$.Order.Date',  
 8               Customer varchar(200) N'$.AccountNumber',   
 9               Quantity int          N'$.Item.Quantity'  
10            )  
11   AS SalesOrderJsonData  
12 WHERE JSON_VALUE(Tab.json, '$.Status') = N'Closed'  
13 ORDER BY JSON_VALUE(Tab.json, '$.Group'), Tab.DateModified

可以在同一個查詢中使用標准表列和來自 JSON 文本的值。 可以在 JSON_VALUE(Tab.json, '$.Status') 表達式上添加索引以提高查詢的性能。 有關詳細信息,請參閱 對 JSON 數據編制索引

2.6 將 JSON 數據導入 SQL Server 表

如果必須將 JSON 數據從外部服務加載到 SQL Server,則可以使用 OPENJSON 將數據導入 SQL Server,而非分析應用程序層中的數據。

 1 DECLARE @jsonVariable NVARCHAR(MAX)
 2 
 3 SET @jsonVariable = N'[  
 4         {  
 5           "Order": {  
 6             "Number":"SO43659",  
 7             "Date":"2011-05-31T00:00:00"  
 8           },  
 9           "AccountNumber":"AW29825",  
10           "Item": {  
11             "Price":2024.9940,  
12             "Quantity":1  
13           }  
14         },  
15         {  
16           "Order": {  
17             "Number":"SO43661",  
18             "Date":"2011-06-01T00:00:00"  
19           },  
20           "AccountNumber":"AW73565",  
21           "Item": {  
22             "Price":2024.9940,  
23             "Quantity":3  
24           }  
25        }  
26   ]'
27 
28 INSERT INTO SalesReport  
29 SELECT SalesOrderJsonData.*  
30 FROM OPENJSON (@jsonVariable, N'$.Orders.OrdersArray')  
31            WITH (  
32               Number   varchar(200) N'$.Order.Number',   
33               Date     datetime     N'$.Order.Date',  
34               Customer varchar(200) N'$.AccountNumber',   
35               Quantity int          N'$.Item.Quantity'  
36            )  
37   AS SalesOrderJsonData;

外部 REST 服務可以提供 JSON 變量的內容,這些內容將從客戶端 JavaScript 框架作為參數發送,或者從外部文件加載。 你可以在 SQL Server 表中輕松插入、更新或合並來自 JSON 文本的結果。 有關此方案的詳細信息,請參閱以下博客文章。

2.7 將 JSON 文件加載到 SQL Server

文件中存儲的信息可格式化為標准 JSON 或行分隔的 JSON。 SQL Server 可以導入 JSON 文件的內容,使用 OPENJSON 或 JSON_VALUE 函數分析內容,並將其加載到表中。

  • 如果 JSON 文檔存儲在可由 SQL Server 訪問的本地文件、共享網絡驅動器或 Azure 文件存儲位置,可以使用批量導入將 JSON 數據加載到 SQL Server。 有關此方案的詳細信息,請參閱 Importing JSON files into SQL Server using OPENROWSET (BULK)(使用 OPENROWSET (BULK) 將 JSON 文件導入 SQL Server)。

  • 如果行分隔的 JSON 文件存儲在 Azure Blob 存儲或 Hadoop 文件系統中,你可以使用 Polybase 來加載 JSON 文本,在 Transact-SQL 代碼中分析文本,然后將其載入表中。

2.8  測試驅動內置的 JSON 支持

使用 AdventureWorks 示例數據庫測試驅動內置 JSON 支持。 若要獲取 AdventureWorks 示例數據庫,必須從 此處。 將示例數據庫還原到 SQL Server 2016 實例后,請解壓縮示例文件,然后從 JSON 文件夾中打開“JSON Sample Queries procedures views and indexes.sql”文件。 運行此文件中的腳本,將某些現有數據的格式重新設置為 JSON 數據,對 JSON 數據運行示例查詢和報告,為 JSON 數據編制索引,然后導入和導出 JSON。

下面是你可以對該文件中包含的腳本執行的操作。

  1. 使現有架構非規范化以創建 JSON 數據的列。

    1. 將 SalesReasons、SalesOrderDetails、SalesPerson、Customer 和包含銷售訂單相關信息的表中的信息存儲到 SalesOrder_json 表的 JSON 列中。

    2. 將 EmailAddresses/PersonPhone 表中的信息作為 JSON 對象的數組存儲到 Person_json 表中。

  2. 創建查詢 JSON 數據的過程和視圖。

  3. 為 JSON 數據編制索引 – 為 JSON 屬性和全文索引創建索引。

  4. 導入和導出 JSON – 創建並運行以 JSON 結果形式導出 Person 和 SalesOrder 表內容,並使用 JSON 輸入導入和更新 Person 與 SalesOrder 表的過程。

  5. 運行查詢示例 – 運行一些查詢,用於調用步驟 2 和 4 中創建的存儲過程與視圖。

  6. 清理腳本 – 如果你想要保留步驟 2 和 4 中創建的存儲過程與視圖,請不要運行此部件。

 

3   參考文獻

 【01】https://docs.microsoft.com/zh-cn/sql/relational-databases/json/json-data-sql-server

4   版權

 

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、復制和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:2016177728@qq.com。
  • 可以轉載該博客,但必須著名博客來源。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM