【SqlServer系列】JSON數據

来源:http://www.cnblogs.com/wangjiming/archive/2017/08/22/7407555.html
-Advertisement-
Play Games

1 概述 1 概述 本文將結合MSDN簡要概述JSON數據。 2 具體內容 2 具體內容 JSON 是一種流行的數據格式,用於在現代 Web 和移動應用程式中交換數據。 JSON 還可用於在 Microsoft Azure DocumentDB 等 NoSQL 資料庫中存儲非結構化數據。 許多 RE ...


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/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該博客,但必須著名博客來源。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ImageSwitch圖像切換控制項 繼承ViewAnimator所以可以做動畫 繼承ViewGroup所以可以裝別的控制項,所以ImageSwitch裡面裝的就是image,不過要找個ImageView來呈現 所以ImageSwitch用一個圖像工廠來顯示ImageView對象圖片。 我們看setIm ...
  • MTK刷機工具Flash_Tool部分4032錯誤解決辦法 先說明一點,這個辦法不是萬能的,我測試解決了以下兩種情況下的4032: 1、本來正常的開發板,因為一次刷機失敗後就一直變4032了 2、新開發板,第一次刷機就4032(在硬體正常的情況下,如果硬體有問題的話,呵呵,老夫掐之一算,累死也刷不進 ...
  • // NSFontAttributeName 設置字體屬性,預設值:字體:Helvetica(Neue) 字型大小:12 // NSForegroundColorAttributeNam 設置字體顏色,取值為 UIColor對象,預設值為黑色 // NSBackgroundColorAttributeN ...
  • 對很多做設計或產品的小伙伴們來說,Sketch應該不會陌生。它是一款由Bohemian Coding團隊一手打造的矢量繪圖應用軟體,最初發佈於2010年,後在2012年榮獲Apple公司ADA設計獎項。從產品開發及功能側重點來講,很多人會認為Sketch是專為UI設計師打造、擅長也只能用於UI設計, ...
  • 項目經過一個月的加班加點,終於這一期算是差不多了,於是便開始了優化工作,今天就發現了一個問題,在iOS10.2系統一下的手機調用系統的撥打電話功能,彈框是不出現的,直接跳轉到撥打電話的界面,但是在iOS10.2及其以上的系統是會出現的,這裡項目的代碼是一樣的,相信開發者都認識,如下 最後查閱資料才知 ...
  • 轉載請說明來源: http://www.cnblogs.com/lizhilin2016/p/7390079.html 最近lz 在開始做一個新的Demo, 在項目中集成了bugly用於收集項目中的崩潰日誌, 集成Bmob用於作為後臺資料庫, 集成了友盟用於集成第三方分享, 當然了, 這些都有很多方 ...
  • 代碼: AppDelegate.m ...
  • 1 概述 1 概述 本篇文章簡要對事物與鎖的分析比較詳細,因此就轉載了。 2 具體內容 2 具體內容 併發可以定義為多個進程同時訪問或修改共用數據的能力。處於活動狀態而互不幹涉的併發用戶進程的數量越多,資料庫系統的併發性就越好。當一個正在修改數據的進程阻止了其他進程讀取該數據,或者當一個正在讀取數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...