在SQL Server中操作JSON資料

黃家瑞 Jerry Huang

  • 精誠資訊/恆逸教育訓練中心-資深講師
  • 技術分類:資料庫

 

 

JSON(JavaScript Object Notation)最早是1999年設計於JavaScript語言中,因為其簡潔的語法格式,利用Name/Value的結構,現今已成為在XML格式之外另一種常見的資料格式語法,許多開發工具的設定檔,從過去的XML格式,很多都已經改以JSON格式,像是廣受程式設計師愛用的Visual Studio Code,設定檔launch.json就是JSON格式。

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-chrome",
            "request": "launch",
            "name": "Open h1.html",
            "file": "d:\\temp\\VSCodeData\\h1.html"
        }
    ]
}     

相較於xml格式的資料結構

<?xml version="1.0" ?>
<configurations>
    <type>pwa-chrome</type>
    <request>launch</request>
    <name>Open h1.html</name>
    <file>d:\\temp\\VSCodeData\\h1.html</file
</configurations>     

除去開始標記(Opening Tag)以及結束標記(Closing Tag)的方式

<type>pwa-chrome</type>     

改以name:value形式描述資料內容

"type": "pwa-chrome",   

資料表現更為精簡,在傳輸資料時檔案更小,也有利於傳輸的速度。 SQL Server 2016之後也加入了對JSON格式的支援,不過並沒有設計xml資料型別,JSON格式是以varchar, nvarchar, char, nchar, varchar(max), nvarchar(max)形式儲存於資料庫中。以下介紹幾個SQL Server中JSON相關語法及函數。

建立JSON資料:(SQL Server 2022以後的版本支援)

SELECT JSON_OBJECT('name':'value', 'type':1)   

結果

JSON陣列:(SQL Server 2022以後的版本支援)

SELECT JSON_ARRAY(
    JSON_OBJECT('name':'A-Product', 'type':1), 
    JSON_OBJECT('name':'B-Product', 'type':1)
)             

結果


查詢JSON資料
JSON_QUERY(), JSON_VALUE():SQL Server 2016以後支援

DECLARE @jsonInfo NVARCHAR(MAX)=
N'{
    "info": {
        "type": 1,
        "address": {
            "town": "Bristol",
            "county": "Avon",
            "country": "England"
        },
        "tags": ["Sport", "Water polo"]
    },
    "type": "Basic"
}';


SELECT JSON_QUERY(@jsonInfo,'$.info.tags');

SELECT JSON_VALUE(@jsonInfo,'$.info.tags[0]');               

執行結果

因為JSON格式的精簡,檔案大小也遠小於XML格式,許多交換格式已逐漸由JSON格式取代原有XML,JSON格式也成了開發系統時不可或缺的技術。SQL Server 2016起加入不少相關語法與支援,由關聯式資料表型式轉為JSON格式(FOR JSON),以及由JSON格式轉為關聯式資料表型式,如以下語法:

SELECT * FROM  
OPENJSON ( @json )  
WITH (   
                Number   varchar(200) '$.Order.Number' ,  
                Date     datetime     '$.Order.Date',  
                Customer varchar(200) '$.AccountNumber',  
                Quantity int          '$.Item.Quantity'  
);                  

善用這些SQL Server中的功能,可以在開發系統時事半功倍,避免一些不必要的程式碼。


您可在下列課程中了解更多技巧喔!