继续说一下2016里面的json功能(1)

首先先来测试数据,数据是使用之前的,就

不要在意这些细节了啊~

借用上一篇的测试数据
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个都好理解,第三个位置,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类型,仅此而已。

一般情况下,用的就是这部分咯~嗯~这次就到这里,下篇再写

 

posted on 2016-04-17 23:44  神崎橙  阅读(538)  评论(0编辑  收藏  举报

导航