使用 OPENJSON 分析和轉換 JSON 數據 (SQL Server)


 

OPENJSON 行集函數可將 JSON 文本轉換為一組行和列。 使用 OPENJSON 將 JSON 集合轉換為行集后,可以在返回的數據上運行任意 SQL 查詢或將其插入到 SQL Server 表中 。

OPENJSON 函數采用單個 JSON 對象或 JSON 對象的集合,並將其轉換為一行或多行。 OPENJSON 函數默認返回以下數據 :

  • 從 JSON 對象中,該函數返回在第一個級別找到的所有“鍵/值”對。
  • 從 JSON 數組中,該函數返回數組的所有元素及其索引。

可以添加可選的 WITH 子句來提供顯式定義輸出結構的架構 。

選項 1 - 具有默認輸出的 OPENJSON

在不提供結果的顯式架構的情況下使用 OPENJSON 函數時(即,在 OPENJSON 之后不使用 WITH 子句),該函數將返回包含以下三列的表 :

  1. 輸入對象中屬性的名稱(或輸入數組中元素的索引) 。
  2. 屬性或數組元素的值 。
  3. 類型(例如,字符串、數字、布爾值、數組或對象) 。

OPENJSON 以單獨的行返回 JSON 對象的每個屬性或數組的每個元素 。

下面是使用具有默認架構(即不包含可選的 WITH 子句)的 OPENJSON 的快捷示例,該示例為 JSON 對象的每個屬性返回一行。

示例

DECLARE @json NVARCHAR(MAX)

SET @json='{"name":"John","surname":"Doe","age":45,"skills":["SQL","C#","MVC"]}';

SELECT *
FROM OPENJSON(@json);

結果

key type
name John 1
surname Doe 1
age 45 2
技能 ["SQL","C#","MVC"] 4

有關具有默認架構的 OPENJSON 的詳細信息

有關詳細信息和更多示例,請參閱使用具有默認架構的 OPENJSON (SQL Server)

有關語法和用法的信息,請參閱 OPENJSON (Transact-SQL)下可用。

選項 2 - 具有顯式結構的 OPENJSON 輸出

如果使用 OPENJSON 函數的 WITH 子句指定結果的架構,該函數返回的表只包含 WITH 子句中定義的列。 在可選的 WITH 子句中,指定一組輸出列、列類型和每個輸出值的 JSON 源屬性的路徑 。 OPENJSON 循環訪問 JSON 對象的數組,讀取每一列的指定路徑上的值,並將值轉換為指定類型。

下面是使用具有 WITH 子句中顯式指定的輸出架構的 OPENJSON 快捷示例 。

示例

DECLARE @json NVARCHAR(MAX)
SET @json =   
  N'[  
       {  
         "Order": {  
           "Number":"SO43659",  
           "Date":"2011-05-31T00:00:00"  
         },  
         "AccountNumber":"AW29825",  
         "Item": {  
           "Price":2024.9940,  
           "Quantity":1  
         }  
       },  
       {  
         "Order": {  
           "Number":"SO43661",  
           "Date":"2011-06-01T00:00:00"  
         },  
         "AccountNumber":"AW73565",  
         "Item": {  
           "Price":2024.9940,  
           "Quantity":3  
         }  
      }  
 ]'  
   
SELECT * FROM  
 OPENJSON ( @json )  
WITH (   
              Number   varchar(200) '$.Order.Number' ,  
              Date     datetime     '$.Order.Date',  
              Customer varchar(200) '$.AccountNumber',  
              Quantity int          '$.Item.Quantity'  
 ) 

結果

Number Date 客戶 數量
SO43659 2011-05-31T00:00:00 AW29825 1
SO43661 2011-06-01T00:00:00 AW73565 3

此函數返回 JSON 數組的元素並將其格式化。

  • 對於 JSON 數組中的每個元素, OPENJSON 會在輸出表中生成新的一行。 JSON 數組中的兩個元素將在返回的表中轉換為兩行。

  • 對於通過使用 colName type json_path 語法指定的每一列,OPENJSON 將指定路徑上的每個數組元素中找到的值轉換為指定類型 。 在此示例中,Date 列的值獲取自路徑 $.Order.Date 上的每個元素,並被轉換為日期時間值。

有關具有顯式架構的 OPENJSON 的詳細信息

有關詳細信息和更多示例,請參閱使用具有顯示架構的 OPENJSON (SQL Server)

有關語法和用法的信息,請參閱 OPENJSON (Transact-SQL)下可用。

OPENJSON 要求兼容性級別 130

OPENJSON 函數僅在 兼容級別 130下可用。 如果數據庫兼容級別低於 130,SQL Server 將無法找到並運行 OPENJSON 函數 。 其他內置 JSON 函數在所有兼容級別均可用。

可以在 sys.databases 視圖或數據庫屬性中查看兼容級別。

可以使用以下命令更改數據庫的兼容級別:
ALTER DATABASE <DatabaseName> SET COMPATIBILITY_LEVEL = 130


免責聲明!

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



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