当前位置: 首页 > news >正文

Sql server开挂的OPENJSON

以前一直用sql server2008,自从升级成sql server2019后,用OPENJSON的感觉像开挂,想想以前表作为参数传输时的痛苦,不堪回首。

》不堪回首
为了执行效率,很多时候希望将表作为参数传给数据库的存储过程。存储过程支持自定义表,只是很麻烦。
1.需要自定义一个表类型
create type paratable as table
(Pname varchar(20),Pcode varchar(20),id int)

2.创建存储过程,参数用自己定义的表类型
create procedure Procedurename
@Paratable paratable 
as
begin
insert into Mtable (Pname,Pcode) select Pname,Pcode from @Paratable
end
如果你的参数结构变量,又需要去修改自定义的表类型,很麻烦。
3.在程序端
SqlConnection myconn = new SqlConnection(connectionString);//链接数据库字符串
SqlCommand mycmd = myconn .CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Procedurename";
SqlParameter p = cmd.Parameters.AddWithValue("@Paratable", paratable);

二》开挂的OPENJSON的威力
有了sql server对Json的支持,状况改变了。
语法:OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]

第一个参数是你的json字符串
第二个参数是json中你要取的部分的路径
第三个参数指定字段名称<with_clause> ::= WITH ( { colName type [ column_path ] [ AS JSON ] } [ ,...n ] )

假设1:要传的Json字符为作为varchar(max)类型传输,
[
{
"name": "John",
"code":"T003"
},
{
"name": "Jane",
"code":"T004"
}
]
最简单的方式,Json里面只有一层:
不指定字段名称
select * from openjson(@pjson)
指定字段名称
select * from openjson(@pjson)
with (
name varchar(20) '$.name',
code varchar(20) '$.code'
)

不过我习惯给起个名,无名感觉不习惯。
{MyTable:
[
{
"name": "John",
"code":"T003"
},
{
"name": "Jane",
"code":"T004"
}
]
}
select * from openjson(@pjson,'$.MyTable')
with (
name varchar(20) '$.name',
code varchar(20) '$.code'
)

假设2:复杂一点,Json里面有层级
DECLARE @json NVARCHAR(MAX) = 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',  
[Order]  NVARCHAR(MAX)  AS JSON  
)

注:还附带了一个 $.sql:identity() 来指定标识列

Json的支持同时带来的还有表结构的设计变化,原来要主表明细表的,现在很多场景可以一张表搞定。

http://www.dtcms.com/a/300644.html

相关文章:

  • USB设备调试
  • 【LeetCode刷题指南】--设计循环队列
  • Java 大视界 -- Java 大数据机器学习模型在电商客户细分与精准营销活动策划中的应用(367)
  • 3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
  • Java面试宝典:MySQL执行原理二
  • MongoDB索引及其原理
  • 接口自动化-logging日志
  • Qt 窗口 工具栏QToolBar、状态栏StatusBar
  • 24点数学游戏(穷举法求解表达式)
  • 基于Matlab自适应阈值分割算法的图像处理研究
  • esp32s3创建rust工程 window成功mac
  • [硬件电路-97]:模拟器件 - 如何通过外部的闭环负反馈,让运算放大器从“暴脾气”、“愣头青”、情绪容易失控者变成“沉着”、“冷静”的精密调控者的?
  • MySQL表的增删改查(基础)
  • 基于鲸鱼算法的三相逆变器分数阶滑模控制参数优化
  • solidity从入门到精通 第六章:安全第一
  • 设备独立性软件-高速缓存与缓冲区
  • 广东省省考备考(第五十八天7.27)——资料分析、数量、判断推理(强化训练)
  • 通过不同坐标系下的两个向量,求解旋转矩阵
  • springboot基于Java的人力资源管理系统设计与实现
  • LabelImg:简洁高效的图像标注工具和下载
  • ROS2入门到精通教程(三)快速体验
  • Unity 实时 CPU 使用率监控
  • 机械学习----knn实战案例----手写数字图像识别
  • 携带参数的表单文件上传 axios, SpringBoot
  • Karonte: Detecting Insecure Multi-binary Interactions in Embedded Firmware论文分享
  • LabelMe数据标注软件介绍和下载
  • UNet 改进(38):融合多尺度输入与可变形卷积、门控特征融合的医学图像Unet分割网络
  • Django实时通信实战:WebSocket与ASGI全解析(下)
  • Flutter开发实战之测试驱动开发
  • 金融科技中的跨境支付、Open API、数字产品服务开发、变革管理