sqlserver通过OPENJSON转换 json数据

2023-05-16

OPENJSON 行集函数可将 JSON 文本转换为一组行和列。 使用 OPENJSON 将 JSON 集合转换为行集后,可以在返回的数据上运行任意 SQL 查询或将其插入到 SQL Server 表中。

OPENJSON 函数采用单个 JSON 对象或 JSON 对象的集合,并将其转换为一行或多行。 OPENJSON 函数默认返回以下数据:

  • 从 JSON 对象中,该函数返回在第一个级别找到的所有“键/值”对。
  • 从 JSON 数组中,该函数返回数组的所有元素及其索引。

可以添加可选的 WITH 子句来提供显式定义输出结构的架构。

选项 1 - 具有默认输出的 OPENJSON

在不提供结果的显式架构的情况下使用 OPENJSON 函数时(即,在 OPENJSON 之后不使用 WITH 子句),该函数将返回包含以下三列的表:

  1. 输入对象中属性的名称(或输入数组中元素的索引)。
  2. 属性或数组元素的值。
  3. 类型(例如,字符串、数字、布尔值、数组或对象)。

OPENJSON 以单独的行返回 JSON 对象的每个属性或数组的每个元素。

下面是使用具有默认架构(即不包含可选的 WITH 子句)的 OPENJSON 的快捷示例,该示例为 JSON 对象的每个属性返回一行。

示例

SQL复制

DECLARE @json NVARCHAR(MAX)

SET @json='{"name":"John","surname":"Doe","age":45,"skills":["SQL","C#","MVC"]}';

SELECT *
FROM OPENJSON(@json);

结果

keytype
nameJohn1
surnameDoe1
age452
技能["SQL","C#","MVC"]4

有关具有默认架构的 OPENJSON 的详细信息

有关详细信息和示例,请参阅将 OPENJSON 与默认架构 (SQL Server) 配合使用。

有关语法和用法,请参阅 OPENJSON (Transact-SQL) 。

选项 2 - 具有显式结构的 OPENJSON 输出

如果使用 OPENJSON 函数的 WITH 子句指定结果的架构,该函数返回的表只包含 WITH 子句中定义的列。 在可选的 WITH 子句中,指定一组输出列、列类型和每个输出值的 JSON 源属性的路径。 OPENJSON 循环访问 JSON 对象的数组,读取每一列的指定路径上的值,并将值转换为指定类型。

下面是使用具有 WITH 子句中显式指定的输出架构的 OPENJSON 快捷示例。

示例

SQL复制

DECLARE @json NVARCHAR(MAX)
SET @json =   
  N'[  
       {  
         "Order": {  
           "Number":"SO43659",  
           "Date":"2011-05-31T00:00:00"  
         },  
         "AccountNumber":"AW29825",  
         "Item": {  
           "Price":2024.9940,  
           "Quantity":1  
         }  
       },  
       {  
         "Order": {  
           "Number":"SO43661",  
           "Date":"2011-06-01T00:00:00"  
         },  
         "AccountNumber":"AW73565",  
         "Item": {  
           "Price":2024.9940,  
           "Quantity":3  
         }  
      }  
 ]'  
   
SELECT * FROM  
 OPENJSON ( @json )  
WITH (   
              Number   varchar(200) '$.Order.Number' ,  
              Date     datetime     '$.Order.Date',  
              Customer varchar(200) '$.AccountNumber',  
              Quantity int          '$.Item.Quantity'  
 ) 

结果

NumberDate客户数量
SO436592011-05-31T00:00:00AW298251
SO436612011-06-01T00:00:00AW735653

此函数返回 JSON 数组的元素并将其格式化。

  • 对于 JSON 数组中的每个元素, OPENJSON 会在输出表中生成新的一行。 JSON 数组中的两个元素将在返回的表中转换为两行。

  • 对于通过使用 colName type json_path 语法指定的每一列,OPENJSON 将指定路径上的每个数组元素中找到的值转换为指定类型。 在此示例中,Date 列的值获取自路径 $.Order.Date 上的每个元素,并被转换为日期时间值。

有关具有显式架构的 OPENJSON 的详细信息

有关详细信息和示例,请参阅将 OPENJSON 与显式架构配合使用 (SQL Server) 。

有关语法和用法,请参阅 OPENJSON (Transact-SQL) 。

OPENJSON 要求兼容性级别 130

查看兼容性sql

--查看兼容性
--database为数据库名称

USE database;  
GO  
SELECT compatibility_level  
FROM sys.databases WHERE name = 'database';  
GO

--示例

USE model;  
GO  
SELECT compatibility_level  
FROM sys.databases WHERE name = 'model';  
GO

OPENJSON 函数仅在 兼容级别 130下可用。 如果数据库兼容级别低于 130,SQL Server 将无法找到并运行 OPENJSON 函数。 其他内置 JSON 函数在所有兼容级别均可用。

可以在 sys.databases 视图或数据库属性中查看兼容级别。

可以使用以下命令更改数据库的兼容级别:
ALTER DATABASE <DatabaseName> SET COMPATIBILITY_LEVEL = 130

将 SQL Server 数据转换为 JSON 或导出 JSON

通过将 FOR JSON 子句添加到 SELECT 语句中,可将 SQL Server 数据或 SQL 查询结果的格式设置为 JSON。 使用 FOR JSON 委托从客户端应用程序到 SQL Server 的 JSON 输出格式。 有关详细信息,请参阅 借助 FOR JSON 将查询结果的格式设置为 JSON (SQL Server)。

以下示例使用 PATH 模式和 FOR JSON 子句。

select keys,firstName ,nameTW,nameEn from ceshi for json path

select keys,firstName as "info.name" ,nameTW,nameEn from ceshi for json path
--使用 ROOT 选项指定一个已命名根元素。
select keys,firstName as "info.name" ,nameTW,nameEn  from ceshi for json path, ROOT('data')

控制其他 JSON 输出选项

使用以下附加选项控制 FOR JSON 子句的输出。

  • ROOT。 若要将单个顶层元素添加到 JSON 输出中,请指定 ROOT 选项。 如果没有指定此选项,JSON 输出不会包括根元素。 有关详细信息,请参阅使用 ROOT 选项 (SQL Server) 将根节点添加到 JSON 输出。

  • INCLUDE_NULL_VALUES。 若要在 JSON 输出中包含 null 值,请指定 INCLUDE_NULL_VALUES 选项。 如果没有指定此选项,输出不会在查询结果中包括 NULL 值的 JSON 属性。 有关详细信息,请参阅使用 INCLUDE_NULL_VALUES 选项 (SQL Server) 在 JSON 输出中包含 Null 值。

  • WITHOUT_ARRAY_WRAPPER。 若要删除默认括住 FOR JSON 子句的 JSON 输出的方括号,请指定 WITHOUT_ARRAY_WRAPPER 选项。 使用此选项可以生成单个 JSON 对象作为单行结果中的输出。 如果不指定此选项,JSON 输出将格式化为数组 - 即括在方括号内。 有关详细信息,请参阅使用 WITHOUT_ARRAY_WRAPPER 选项从 JSON 输出中删除方括号 (SQL Server)。

如有侵权联系作者删除

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlserver通过OPENJSON转换 json数据 的相关文章

随机推荐

  • docker安装nextcloud出现“ 内部服务器错误”

    在Linux系统上安装好nextcloud后 xff0c 到浏览器中连接到nextcloud时 xff0c 遇到如下错误 xff1a 在使用docker logs nextcloud查看容器nextcloud的日志后 xff0c 发现是在配
  • openstack官方文档查找

    openstack官网 xff1a www openstack org https docs openstack org ocata zh CN install guide rdo environment html ocata中文安装手册网
  • Ubuntu下为Apache简单配置SSL的方法(HTTPS的实现)

    1 启用 ssl 模块 sudo a2enmod ssl 2 安装openssl sudo apt get install openssl 3 创建CA签名 不使用密码去除 des3选项 openssl genrsa des3 out se
  • Linux查看防火墙,开放端口

    1 查看防火墙状态 systemctl status firewalld 2 如果不是显示active状态 xff0c 需要打开防火墙 systemctl start firewalld 3 查看所有已开放的临时端口 xff08 默认为空
  • 05_用户管理

    目录 一 用户及用户组存在的意义二 用户及用户组在系统中的存在方式三 用户切换01 用户查看02 用户切换 四 用户涉及到的系统配置文件01 etc passwd 02 etc group 03 etc skel 04 etc shadow
  • Java String匹配算法

    1 String匹配算法 在一个文本或者较长的一段字符串中 xff0c 找出一个指定字符串 xff0c 并返回其位置 指定一个父类AbstractMatch xff0c 使用matchAtPosition String int 查看是否匹配
  • pycharm从远程仓库clone时“Authentication failed for '仓库地址'”的问题解决

    背景 xff1a 使用pycharm Git clone 时 xff0c 输错了账户名 xff0c 提示 Authentication failed for 39 仓库地址 39 xff0c 但pycharm将错误的账户名保存了 xff0c
  • windows10安装docker的若干坑--Docker Desktop requires Windows 10 Pro/Enterprise (15063+)

    安装docker for windows时报错 xff1a Docker Desktop requires Windows 10 Pro Enterprise 15063 43 or Windows 10 Home 19018 43 原因
  • sklearn接口报错Input contains NaN, infinity or a value too large for dtype(‘float64‘)

    1 错误场景 某个包调用了sklearn接口 xff0c 在fit x y 时报错Input contains NaN infinity or a value too large for dtype 39 float64 39 2 错误原因
  • 在shell中执行conda activate报错:Your shell has not been properly configured to use ‘conda activate‘.

    今天想要在Mac上执行一段自动启动jupyter的shell脚本 xff0c 但是出现了错误 错误代码 xff1a CommandNotFoundError Your shell has not been properly configur
  • centos7安装CUDA11.2+CUDNN8.1+tensorflow2.4

    环境 xff1a 系统 xff1a centos7 CPU xff1a Intel R Xeon R Gold 5220 CPU 64 2 20GHz 36核 GPU xff1a Tesla V100 4 查看CPU信息 xff1a cat
  • 开源时序建模框架Kats

    KATS简介 时间序列分析建模是数据科学和机器学习的一个重要的领域 xff0c 在电子商务 金融 供应链管理 医学 气象 能源 天文等诸多领域有着广泛的应用 目前时间序列分析以及建模的技术非常多 xff0c 但相对散乱 Facebook开源
  • 包含动画的PPT转为PDF

    目的 xff1a 带动画的PPT转化为PDF xff0c PDF的每一页是动画的一个步骤 方法 xff1a 使用 宏 参考链接 xff1a https www codercto com a 70548 html 具体方法 xff08 win
  • windows中docker编写一个dockerfile文件

    Dockerfile文件描述了当我们启动镜像的时候需要哪些软件元素 除了软件元素之外 xff0c Dockerfile 还能够让我们能够在启动镜像的时候在容器中运行一些命令或者指明我们使用什么样的环境 使用虚拟机中的vim命令编写docke
  • spyder增加模块代码提示功能

    最近在配置tensorflow xff0c 可是发现使用spyder的时候无法加载tensorflow的代码提示 xff0c 需要自己输入完整的函数名称 xff0c 十分不方便 xff0c 于是从网上找了一些资料 xff0c 来解决spyd
  • conda activate报错:gbk相关错误

    使用conda create n 建立新的虚拟环境后 xff0c 使用activate无法进入虚拟环境 xff0c 报了一个和gbk相关的错误 xff0c 后来经排查发现 xff0c 是系统环境变量中包含中文字符 xff0c 把系统变量中所
  • scanf源码分析

    本文分析的是glibc2 31中的scanf相关源码 xff0c 目的不是研究scanf的算法 xff0c 而是说明scanf在IO attack中的利用方法 xff0c 属于CTF的范畴 scanf c 其实就是对 vscanf inte
  • windows建立定时任务执行bat脚本

    在Linux中我们可以通过crontab来定时执行脚本 xff0c 那么windows中如何执行呢 xff1f 为了避免分支冲突 xff0c 准备在每天上班的时候自动将git远程仓库的最新版本pull下来 xff0c 然后在下班时间自动将重
  • 需账号密码登陆的网页爬虫

    对于普通网页的爬取十分简单 xff0c 如果网站没有任何反爬机制 xff0c 只要以下代码就可以实现对于网页的爬取 span class token keyword import span requests html span class
  • sqlserver通过OPENJSON转换 json数据

    OPENJSON 行集函数可将 JSON 文本转换为一组行和列 使用 OPENJSON 将 JSON 集合转换为行集后 xff0c 可以在返回的数据上运行任意 SQL 查询或将其插入到 SQL Server 表中 OPENJSON 函数采用