茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1669032 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00121.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

DB研討會 : [轉貼]T-SQL OPENJSON

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]T-SQL OPENJSON

Hi,大家好,最近玩 T-SQL 用到了很特別的 OPENJSON 函式,以往處理 JSON 都會在前後端解決,想不到 SQL 能利用 OPENJSON 函式直接把 JSON 當成一個資料表來存取

NOTE

T-SQL OPENJSON 函式適用於 SQL Server 2016 以上

OPENJSON 預設輸出

OPENJSON 大多會搭配 WITH 子句來使用(稍後會使用到),如果不搭配 WITH,會傳回預設輸出

  1. key: 物件屬性名稱

  2. value: 值

  3. type: 類型

    • 0 -> null
    • 1 -> String
    • 2 -> Number
    • 3 -> Boolean
    • 4 -> Array
    • 5 -> Object

    類型是隨 JSON 值的型態不同而產生的數字,詳情可以看到 官方文檔 有對傳回值做詳細說明

使用 OPENJSON 剖析轉換 JSON

剖析 JSON 物件

sql


1
2
3
4
5
6
7
8
9
10
11
12

DECLARE @json VARCHAR(MAX) = '
{
"name": "horse",
"age": 18,
"isHandsome": true,
"nullValue": null,
"arrayValue": [1, 2, 3],
"objectValue": { "obj": "objString" }
}
';

SELECT * FROM OPENJSON(@json);

剖析 JSON 物件陣列

sql


1
2
3
4
5
6
7
8
9
10
11
12
13
14

DECLARE @json VARCHAR(MAX) = '
[
{
"name": "horse",
"age": 18
},
{
"name": "Otis",
"age": 18
}
]
';

SELECT * FROM OPENJSON(@json);

這種預設結構的顯示結果應該是或多或少會有需要用到的時候,不過筆者主要使用到的是下一種搭配 WITH 的用法,能夠帶有明確的結構,簡直就像是把 JSON 當作一張資料表來使用

有明確結構的 OPENJSON 輸出

使用 OPENJSON 函數的 WITH 子句指定結果的結構描述時,會傳回在 WITH 子句中所定義之資料行的資料表,逐一查看 JSON 物件陣列、讀取為每個資料行指定的值,並將值轉換成指定的型別

剖析物件陣列,搭配 WITH

sql


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

DECLARE @json VARCHAR(MAX) = '
[
{
"name": "horse",
"age": 18
},
{
"name": "Otis",
"age": 18
}
]
';

SELECT *
FROM OPENJSON(@json)
WITH (name VARCHAR(100) '$.name',
age INT '$.age')

可以看到他把陣列內的兩筆物件給按照 WITH 子句所寫的結構描述來呈現

總結

本篇只有帶出最簡易的 OPENJSON 用法,有時 JSON 結構可能會更複雜,那要處理時所寫的 SQL 程式就不只這樣,其實還有很多操作 JSON 的函式還沒有寫到

另外,在實務上,接到一包 JSON,後續通常是要用來做 INSERT 或 UPDATE 等等的 SQL 操作

這些就留待後續的文章補上

參考資料

  1. 使用 OPENJSON 剖析及轉換 JSON 資料 (SQL Server)

原文出處:T-SQL OPENJSON,想不到能直接用 SQL 來處理 JSON | 小馬彬的部落格
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]SQL Server 2016 新語法 - ISJSON、JSON_MODIFY、OPENJSON

[Database][SQL Server] SQL Server 2016 新語法 - ISJSON 、 JSON_MODIFY 與 OPENJSON

前言

Microsoft SQL Server 2016 版本開始對於 JSON 資料型態提供多種語法上的支援,在這一篇我們將簡單介紹 ISJSON、 JSON_MODIFY 與 OPENJSON。這些語法的作用為:

  ISJSON
 用於驗證資料格式是否為 JSON 格式,是回傳 true;否則回傳 false
 用於修改 JSON 資料內容
 對於 JSON 資料進行解析,拆解成資料表格是顯示 Key、Value 與類型;配合 WITH 語法可接 JSON 轉換成資料表結果。

本篇文章若有錯誤或任何建議,請各位先進不吝指教。



介紹

ISJSON
這個簡單的函式可以用來驗證帶入的資料內容是否為正確的 JSON 格式,避免錯誤的資料造成程式錯誤。我們透過範例簡單說明 ISJSON 用法:
Step 1. 首先我們先建立範例資料表與資料,其中有幾筆資料的 Note 欄位存放正確 JSON 資料:





Step 2.我們透過下列語法,找出 Note 中格式為 JSON 的資料

    SELECT [Id]
,[Name]
,[Salary]
,[Note]
FROM [test].[dbo].[Employee]
WHERE ISJSON(Note) > 0

Step 3. 結果






JSON_MODIFY
JSON_MODIFY 可對於 JSON 資料進行操作,修改資料內容,下面的範例簡單說明如何使用JSON_MODIFY。
Step 1. 我們先建立一個 NVARCHAR(MAX) 資料,寫入 JSON 資料:

DECLARE @jsonInfo NVARCHAR(MAX);
SET @jsonInfo = N'{
"Id":1,
"Name":"Duran",
"Salary":1000,
"Role":[
"developer",
"QA"
]
}'
print @jsonInfo






Step 2.我們透過下列語法,嘗試將 Role JSON Array 第一筆資料改成 Designer
關於 JSON PATH 表示方法,請參考 這裡

DECLARE @jsonInfo NVARCHAR(MAX);
SET @jsonInfo = N'{
"Id":1,
"Name":"Duran",
"Salary":1000,
"Role":[
"developer",
"QA"
]
}'
DECLARE @info NVARCHAR(MAX);
SET @info = JSON_MODIFY(@jsonInfo, '$.Role[0]', 'Designer')
print @info







OPENJSON
OPENJSON 函式能將 JSON 資料轉換成資料表方式呈現。首先我們先建立以下字串內容,並透過 OPENJSON 印出結果:

DECLARE @jsonInfo NVARCHAR(MAX);
SET @jsonInfo = N'{
"Id":1,
"Name":"Duran",
"Salary":1000,
"Role":[
"developer",
"QA"
]
}'
SELECT *
FROM OPENJSON(@jsonInfo)




您能看見 OPENJSON 將 key-value 分離出來,依據不同資料型態進行分類(文字1、數字2...依此類推)。

接下來,我們透過 with 語法,將資料轉換成資料表格式呈現。其中若不想進行轉換,可以透過AS JSON直接儲存JSON資料,但記得其格式一定要為 nvarchar(MAX)。

SELECT *
FROM OPENJSON(@jsonInfo)
WITH (
Id INT '$.Id',
Name nvarchar(20) '$.Name',
Salary INT '$.Salary',
Role nvarchar(MAX) AS JSON
)








參考資料

1.  OPENJSON (TRANSACT-SQL) - Microsoft docs
2.  使用內建函數,驗證、查詢以及變更 JSON 資料 (SQL Server) - Microsoft docs


JSON PATH 
下列為 JSON 範例,表格中為 JSON 表示的資料內容


{
"Id":1,
"Name":"Duran",
"Salary":1000,
"Role":[
"developer",
"QA"
]
}


相關文章

1. [Database][SQL Server] SQL Server 2016 新語法 - FOR JSON AUTO 與 FOR JSON PATH
2. [Database][SQL Server] SQL Server 2016 新語法 - JSON_VALUE 與 JSON_QUERY
3. [Database][SQL Server] SQL Server 2016 新語法 - DROP IF EXISTS



原文出處:[Database][SQL Server] SQL Server 2016 新語法 - ISJSON 、 JSON_MODIFY 與 OPENJSON
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|