引き続き2016のjson機能(1)についてお話しします

9621 ワード

まずデータをテストして、データは使用する前に、
細かいことは気にしないでね~
          
create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int)

insert into t1 values ('  ',90,80),('  ',75,90),('  ',68,100),('  ',90,null);

 
次に、このテーブルで生成されたjsonを使用してテストを行います.最も簡単な例です.
declare @v nvarchar(600) = N'[{"ID":1,"name":"  ","Chinese":90,"Math":80},{"ID":2,"name":"  ","Chinese":75,"Math":90},{"ID":3,"name":"  ","Chinese":68,"Math":100},{"ID":4,"name":"  ","Chinese":100}]'

select * from openjson(@v)
with (
ID int '$.ID',
name nvarchar(50) '$.name',
Math int '$.Math',
Chinese int '$.Chinese'
)

------------------------
ID          name                                               Math        Chinese
----------- -------------------------------------------------- ----------- -----------
1                                                              80          90
2                                                              90          75
3                                                              100         68
4                                                              NULL        100

最も簡単にJsonを結果セットに解析する形式であり,ノードが存在しない場合は付与値は空である.
実はopenxmlの使い方と似ています
 
そして用法2は,jsonフォーマットの中のフォーマットを解析することができ,openjsonの後ろにキーワードwithが付いていない場合,json自体の構造を解析すると考えられる.例えば(テキストにフォーマットするのはこの文の下でちょっとおかしいので、結果セットで貼って、ちょっと散らかって、みんなで我慢します)
declare @v nvarchar(600) = N'{"ID":1,"name":"  ","Chinese":90,"Math":80}'
select * from openjson(@v)


key    value         type
ID           1    2
name              1
Chinese    90    2
Math    80    2

 
前の2つはよく理解して、3番目の位置、type.タイプはopenjsonの解析ではこうです
0  null
1 string
2 int
3 bool
4 array
5 object
 
ID、Math、Chineseはすべて整形で、名前は文字列で、それからもう一つの例に来ます
declare @v nvarchar(600) = N'{"ID":true,"name":null,"Chinese":9.9,"Math":"hello","arr":[1,2,3,4],"obj":{"name":"test"}}'
select * from openjson(@v)


key    value     type
ID    true    3
name     NULL    0
Chinese    9.9    2
Math    hello    1
arr    [1,2,3,4]    4
obj    {"name":"test"}    5  

ここでは9.9のようなタイプでもopenjsonを使うと整形していると思われるので、タイプを解析しても正確なデータ型をもたらすとはあまり信じないでください.jsonに複数の行オブジェクトが含まれている場合、openjson withのフォーマットで解析できると聞かれるかもしれませんが、どうやって認定しますか?例えば
declare @v nvarchar(600) = N'[{"ID":1,"name":"  ","Chinese":90,"Math":80},{"ID":2,"name":"  ","Chinese":75,"Math":90},{"ID":3,"name":"  ","Chinese":68,"Math":100},{"ID":4,"name":"  ","Chinese":100}]'

Openjsonを用いて直接解析すると,4つの列がすべてObjectタイプであることが明らかになったが,それだけである.
一般的には、この部分を使っていますよね~ん~今回はここまでにして、次の文章を書きます