sql server之在儲存過程中利用OpenJson將Json字串轉化為表格
阿新 • • 發佈:2019-01-09
在Sql server2016的版本後,資料庫增加了對Json格式的支援,詳細資訊可以參考微軟官方文件連結
應用背景
線上訂餐系統中,購物車的內容儲存在瀏覽器快取中,所以資料庫關於訂單的設計是訂單表(訂單ID,送貨地址,使用者ID,,,,,),訂單明細表(訂單ID,菜品ID,菜品數量,菜品價格,,,,)。使用者提交下單資訊後,將訂單資訊和購物車快取寫入Json格式的Order字串內,傳到後臺,在儲存過程裡利用OpenJson將JSon字串轉化為表格。以下基於sql server2017和.net4.0。
傳到後臺的Json字串
{
"CountPrice":57 ,
"orderInfo":[
{
"ID":1,
"MealName":"水煮肉片蓋澆飯",
"Price":16,
"img":"/dishImages/4.jpg",
"MealDes":"美味的水煮肉片",
"MealTypeID":1,
"TypeID":1,
"TypeName":"蓋澆飯",
"counter ":2
},
{
"ID":2,
"MealName":"紅燒肉蓋澆飯",
"Price":20,
"img":"/dishImages/5.jpg",
"MealDes":"美味的紅燒肉",
"MealTypeID":1,
"TypeID":1,
"TypeName":"蓋澆飯",
"counter ":1
},
{
"ID":4,
"MealName":"可樂",
"Price":5,
"img":"/dishImages/2.jpg",
"MealDes":"好喝可樂",
"MealTypeID":2,
"TypeID":2,
"TypeName":"飲料",
"counter":1
}
],
"userInfo":{
"un":"zhulin",
"phone":"1827116754",
"address":"武漢"
}
}
儲存過程
這裡引數2是是儲存在Session裡面的使用者ID,引數二是Json字串
注意要點,利用$來訪問時,物件和陣列訪問方式不一樣。
create proc [dbo].[insert_order_orderdetails] @memberid int,@json NVARCHAR(MAX)
as
begin
declare @total int,@phone varchar(50),@address varchar(50)
--取出總價,取出手機號碼,送貨地址
SELECT @total=total FROM OPENJSON(@json)
with (total int '$.CountPrice')
select @phone=phone,@address=DeliveryAddress from OpenJson(@json)
with(phone varchar(50)'$.userInfo.phone',DeliveryAddress varchar(50) '$.userInfo.address')
--插入訂單表
insert into MyOrder(MemberID,DeliveryAddress,TotalMoney,phone) values(@memberid,@address,@total,@phone)
drop table temp--刪除之前存在的臨時表
create table temp(OrderID int )
----獲得最大訂單號並插入臨時表temp
insert into temp
select Max(OrderID) from MyOrder
--臨時表和Json轉化的表格進行笛卡爾積獲得要插入到訂單明表中的部分表
insert into OrderDetails
select * from temp cross join OpenJson(@json,N'$.orderInfo')
with
(MealID int '$.ID',--直接從$.orderInfo下面的目錄開始訪問
MealPrice int '$.Price',
MealCount int '$.counter'
)as t
end
後臺
一般處理程式
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
//獲取訂單
String orderStr = context.Request["order"];
SqlParameter[] parameter = {
new SqlParameter("@memberid", 1),
//Convert.ToInt32( context.Session["userid"])), 若在登陸狀態
new SqlParameter("@json",orderStr)
};
SqlHelper.Proc("insert_order_orderdetails", parameter);
}