SqlServer2016 JSON格式数据操作

JSON结构转为列表模式

DECLARE @json NVARCHAR(MAX) = N'
{
"001":null,
"002":"Duffy",
"003":123,
"004":456.789,
"005":["Dev","QA","PM"],
"006":{"Country":"Canada","Territory":"North America"}
}'
1.  SELECT * FROM OPENJSON(@json)

结果:

key    value                        type
001    NULL                        0
002    Duffy                         1
003    123                            2
004    456.789                     2
005    ["Dev","QA","PM"]     4
006    {"Country":"Canada","Territory":"North America"}    5

2. SELECT [key], value FROM OPENJSON(@json, '$."006"')

key           value
Country    Canada
Territory    North America

3. 判断是否为JSON字符串

SELECT CASE WHEN ISJSON(@json) > 0 THEN 'IS JSON.' ELSE 'NOT JSON.' END

 

4. 从一个JSON片段中抽取一个标量值

with tbl(strjson) as
(
  select  N'{
      "001":null,
      "002":"Duffy",
      "003":123,
      "004":456.789,
      "005":["Dev","QA","PM"],
      "006":{"Country":"Canada","Territory":"North America"}
    }'
)
SELECT JSON_VALUE(strjson, '$."006".Country') from tbl

结果:

Canada

5.  从一个JSON片段中抽取了一个对象或数组

with tbl(strjson) as
(
  select  N'{
      "001":null,
      "002":"Duffy",
      "003":123,
      "004":456.789,
      "005":["Dev","QA","PM"],
      "006":{"Country":"Canada","Territory":"North America"}
    }'
)
SELECT JSON_QUERY(strjson, '$."006"') from tbl

结果:

{"Country":"Canada","Territory":"North America"}

 

将查询结果输出JSON格式

with tbl(id, descr) as
(
  select  '001', 'AAA' union all
  select  '002', 'BBB' union all
  select  '003', 'CCC'
)

将SELECT语句的结果以JSON输出

select id, descr from tbl for json auto

结果:

[{"id":"001","descr":"AAA"},{"id":"002","descr":"BBB"},{"id":"003","descr":"CCC"}]

将SELECT语句的结果以JSON输出, 并为FOR JSON加上Root Key
select id, descr from tbl for json auto, root('list')

结果:

{"list":[{"id":"001","descr":"AAA"},{"id":"002","descr":"BBB"},{"id":"003","descr":"CCC"}]}

 

要自定义输出JSON格式的结构时,必须使用JSONPATH。

若SELECT的列中,存在列名名称相同时,必须用别名重命名

 JSONPATH输出

select id, descr from tbl for json path

 JSONPATH+ROOT输出

select id, descr from tbl for json path, root('list')

为NULL的数据在输出JSON时,会被忽略,若想要让NULL的字段也显示出来,可以加上选项INCLUDE_NULL_VALUES,该选项也适用于AUTO

select id, descr from tbl for json path, root('list'), INCLUDE_NULL_VALUES

 

带有层级关系的,可以增加节点,比如下面的SQL,增加了一个“SN”节点,把栏位SERNUM和CLIMAT放在里面

SqlServer2016 JSON格式数据操作

 

通过WITH选项,自定义输出列

SqlServer2016 JSON格式数据操作