首先先来测试数据,数据是使用之前的,就
不要在意这些细节了啊~
借用上一篇的测试数据 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类型,仅此而已。
一般情况下,用的就是这部分咯~嗯~这次就到这里,下篇再写