一.先检查sql server版本是否支持JSON函数,不支持会提示:关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。
二.函数名:OPENJSON
三.例子
1.数据
[
{"CouponCode":"1913845574565660","CouponType":1,"CouponValue":50,"UsedValue":50,"Title":"50元现金券","Remark":""},
{"CouponCode":"1913860576769040","CouponType":2,"CouponValue":12,"UsedValue":12,"Title":"娃娃菜","Remark":""},
{"CouponCode":"1913874913739220","CouponType":2,"CouponValue":36,"UsedValue":36,"Title":"牛肉抵用券","Remark":""}
]
2.代码
DECLARE @json2 NVARCHAR(MAX);
SET @json2 = N'要转换的json数据';
SELECT *
FROM OPENJSON(@json2)
WITH (
CouponCode NVARCHAR(50),
CouponType INT,
CouponValue decimal,
UsedValue decimal,
Title varchar(200),
Remark varchar(200)
);
执行结果
四.通过游标遍历结果集,将JSON内容转换成行并插入临时表
if object_id('tempdb..#DeptCoupon') is not null
drop table #DeptCoupon
create table #DeptCoupon --创建临时表#DeptCoupon
(
CouponCode NVARCHAR(80),
CouponType INT,
CouponValue decimal,
UsedValue decimal,
Title varchar(200),
Remark varchar(200)
);
declare @DeptName nvarchar(2000),@StartDate nvarchar(50),@AdditionalData nvarchar(2000)
declare order_cursor cursor --定义游标
for (select DeptName,CONVERT(varchar(100), StartDate, 23),AdditionalData from tableName) --为游标赋值一个数据集
open order_cursor --打开游标
etch next from order_cursor into @DeptName,@StartDate,@AdditionalData --开始循环游标变量(从数据集中拿出第一条数据)
while @@FETCH_STATUS = 0 --返回被 FETCH语句执行的最后游标的状态 (固定写法)
begin
insert into #DeptCoupon
SELECT @DeptName as 'DeptName',@StartDate as 'StartDate',*
FROM OPENJSON(@AdditionalData)
WITH (
CouponCode NVARCHAR(50),
CouponType INT,
CouponValue decimal,
UsedValue decimal,
Title varchar(200),
Remark varchar(200)
)
fetch next from order_cursor into @DeptName,@StartDate,@AdditionalData --转到下一个游标(取下条数据集)
end
close order_cursor -- 关闭游标
deallocate order_cursor -- 释放游标