1. 程式人生 > >sql server之在儲存過程中利用OpenJson將Json字串轉化為表格

sql server之在儲存過程中利用OpenJson將Json字串轉化為表格

在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);


            }