日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SQL Server 2016 JSON原生支持实例说明

發布時間:2023/12/20 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 2016 JSON原生支持实例说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:SQL Server 2016 JSON原生支持實例說明

背景

Microsoft SQL Server 對于數據平臺的開發者來說越來越友好。比如已經原生支持XML很多年了,在這個趨勢下,如今也能在SQLServer2016中使用內置的JSON。尤其對于一些大數據很數據接口的解析環節來說這顯得非常有價值。與我們現在所做比如在SQL中使用CLR或者自定義的函數來解析JSON相比較,新的內置JSON會大大提高性能,同時優化了編程以及增刪查改等方法。

??? 那么是否意味著我們可以丟棄XML,然后開始使用JSON?當然不是,這取決于數據輸出處理的目的。如果有一個外部的通過XML與外部交互數據的服務并且內外的架構是一致的,那么應該是使用XML數據類型以及原生的函數。如果是針對微型服務架構或者動態元數據和數據存儲,那么久應該利用最新的JSON函數。

實例

??? 當使用查詢這些已經有固定架構的JSON的數據表時,使用“FOR JSON” 提示在你的T-SQL腳本后面,用這種方式以便于格式化輸出。一下實例我使用了SQLServer 2016 Worldwide Importers sample database,可以在GitHub上直接下載下來(下載地址)。看一下視圖Website.customers。我們查詢一個數據并格式化輸出JSON格式:

SELECT [CustomerID],[CustomerName],[CustomerCategoryName],[PrimaryContact],[AlternateContact],[PhoneNumber],[FaxNumber],[BuyingGroupName],[WebsiteURL],[DeliveryMethod],[CityName],DeliveryLocation.ToString() as DeliveryLocation,[DeliveryRun],[RunPosition]FROM [WideWorldImporters].[Website].[Customers]WHERE CustomerID=1FOR JSON AUTO

  

?

請注意我們有一個地理數據類型列(DeliveryLocation),這需要引入兩個重要的變通方案(標黃):

首先,需要轉換一個string字符,否則就會報錯:

FOR JSON cannot serialize CLR objects. Cast CLR types explicitly into one of the supported types in FOR JSON queries.

其次,JSON采用鍵值對的語法因此必須指定一個別名來轉換數據,如果失敗會出現下面的錯誤:

Column expressions and data sources without names or aliases cannot be formatted as JSON text using FOR JSON clause. Add alias to the unnamed column or table.

確認了這些,改寫的格式化輸出如下:

[{"CustomerID": 1,"CustomerName": "Tailspin Toys (Head Office)","CustomerCategoryName": "Novelty Shop","PrimaryContact": "Waldemar Fisar","AlternateContact": "Laimonis Berzins","PhoneNumber": "(308) 555-0100","FaxNumber": "(308) 555-0101","BuyingGroupName": "Tailspin Toys","WebsiteURL": "http://www.tailspintoys.com","DeliveryMethod": "Delivery Van","CityName": "Lisco","DeliveryLocation": "POINT (-102.6201979 41.4972022)","DeliveryRun": "","RunPosition": ""} ]

  

?

當然也可以使用JSON作為輸入型DML語句,例如INSERT/UPDATE/DELETE 語句中使用“OPENJSON”。因此可以在所有的數據操作上加入JSON提示。

如果不了解數據結構或者想讓其更加靈活,那么可以將數據存儲為一個JSON格式的字符類型,改列的類型可以使NVARCHAR 類型。Application.People 表中的CustomFields 列就是典型這種情況。可以用如下語句看一下表格格式這個列的內容:

declare @json nvarchar(max)SELECT @json=[CustomFields] FROM [WideWorldImporters].[Application].[People] where PersonID=8select * from openjson(@json)

  

?

結果集在表格結果中的顯示:

?

用另一種方式來查詢這條記錄,前提是需要知道在JSON數據結構和關鍵的名字,使用JSON_VALUE 和JSON_QUERY 函數:

SELECTJSON_QUERY([CustomFields],'$.OtherLanguages') as OtherLanguages,JSON_VALUE([CustomFields],'$.HireDate') as HireDate,JSON_VALUE([CustomFields],'$.Title') as Title,JSON_VALUE([CustomFields],'$.PrimarySalesTerritory') as PrimarySalesTerritory,JSON_VALUE([CustomFields],'$.CommissionRate') as CommissionRateFROM [WideWorldImporters].[Application].[People]where PersonID=8

  

?

在表格結果集中展示表格格式的結果:

?

這個地方最關心就是查詢條件和添加索引。設想一下我們打算去查詢所有2011年以后雇傭的人,你可以運行下面的查詢語句:

SELECT personID,fullName,JSON_VALUE(CustomFields,'$.HireDate') as hireDate FROM [WideWorldImporters].[Application].[People] where IsEmployee=1 and year(cast(JSON_VALUE(CustomFields,'$.HireDate') as date))>2011

  

?

切記JSON_VALUE 返回一個單一的文本值(nvarchar(4000))。需要轉換返回值到一個時間字段中,然后分離年來篩選查詢條件。實際執行計劃如下:

?

為了驗證如何對JSON內容創建索引,需要創建一個計算列。為了舉例說明,Application.People 表標記版本,并且加入計算列,當系統版本為ON的時候不支持。我們這里使用Sales.Invoices表,其中ReturnedDeliveryData 中插入json數據。接下來獲取數據,感受一下:

SELECT TOP 100 [InvoiceID],[CustomerID],JSON_QUERY([ReturnedDeliveryData],'$.Events')FROM [WideWorldImporters].[Sales].[Invoices]

  

?

發現結果集第一個event都是“Ready for collection”:

?

然后獲取2016年3月的發票數據:

SELECT [InvoiceID],[CustomerID],CONVERT(datetime, CONVERT(varchar,JSON_VALUE([ReturnedDeliveryData],'$.Events[0].EventTime')),126)FROM [WideWorldImporters].[Sales].[Invoices]WHERE CONVERT(datetime, CONVERT(varchar,JSON_VALUE([ReturnedDeliveryData],'$.Events[0].EventTime')),126)BETWEEN '20160301' AND '20160331'

  

實際執行計劃如下:

?

??? 加入一個計算列叫做“ReadyDate”, 準備好集合表達式的結果:

ALTER TABLE [WideWorldImporters].[Sales].[Invoices] ADD ReadyDate AS CONVERT(datetime, CONVERT(varchar,JSON_VALUE([ReturnedDeliveryData],'$.Events[0].EventTime')),126)

  

?

之后,重新執行查詢,但是使用新的計算列作為條件:

SELECT [InvoiceID],[CustomerID],ReadyDateFROM [WideWorldImporters].[Sales].[Invoices]WHERE ReadyDate BETWEEN '20160301' AND '20160331'

  

?

執行計劃是一樣的,除了SSMS建議的缺失索引:

?

因此,根據建議在計算列上建立索引來幫助查詢,建立索引如下:

/* The Query Processor estimates that implementing the following index could improve the query cost by 99.272%. */ CREATE NONCLUSTERED INDEX IX_Invoices_ReadyDate ON [Sales].[Invoices] ([ReadyDate]) INCLUDE ([InvoiceID],[CustomerID]) GO

  

?

我們重新執行查詢驗證執行計劃:

?

有了索引之后,大大提升了性能,并且查詢JSON的速度和表列是一樣快的。

總結:

本篇通過對SQL2016 中的新增的內置JSON進行了簡單介紹,主要有如下要點:

?

  • JSON能在SQLServer2016中高效的使用,但是JSON并不是原生數據類型;
  • 如果使用JSON格式必須為輸出結果是表達式的提供別名;
  • JSON_VALUE 和 JSON_QUERY? 函數轉移和獲取Varchar格式的數據,因此必須將數據轉譯成你需要的類型。
  • 在計算列的幫助下查詢JSON可以使用索引進行優化。

總結

以上是生活随笔為你收集整理的SQL Server 2016 JSON原生支持实例说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。