一.先檢查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 -- 釋放游標

