ประมวลผลข้อมูล JSON ด้วยฟังก์ชันในตัว

เสร็จสมบูรณ์เมื่อ

เคล็ดลับ

ดูแท็บ ข้อความและรูปภาพ สําหรับรายละเอียดเพิ่มเติม!

พิจารณาสถานการณ์ที่แอปพลิเคชันอีคอมเมิร์ซของคุณจัดเก็บการกําหนดลักษณะของลูกค้าและข้อมูลเมตาของคําสั่งซื้อเป็นเอกสาร JSON แอปบนอุปกรณ์เคลื่อนที่จะส่งข้อมูลตะกร้าสินค้าในรูปแบบ JSON และระบบการรายงานของคุณจําเป็นต้องส่งออกแค็ตตาล็อกผลิตภัณฑ์เป็น JSON สําหรับ Web API การทํางานโดยตรงกับ JSON ในฐานข้อมูลของคุณช่วยลดความจําเป็นในการแปลงเลเยอร์แอปพลิเคชัน และทําให้การประมวลผลข้อมูลของคุณมีประสิทธิภาพ

ฐานข้อมูล SQL Server, Azure SQL และ SQL ใน Fabric ให้การสนับสนุน JSON ในตัวที่ช่วยให้คุณแยกวิเคราะห์ สืบค้น สร้าง และแปลงข้อมูล JSON ได้โดยตรงใน T-SQL ในหน่วยนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน JSON เพื่อแยกค่า สร้างเอาต์พุต JSON รวมข้อมูลลงในอาร์เรย์ JSON และตรวจสอบเนื้อหา JSON

แยกค่าด้วย JSON_VALUE และ JSON_QUERY

เมื่อทํางานกับ JSON ที่จัดเก็บไว้ในฐานข้อมูล คุณต้องแยกค่าเฉพาะสําหรับการกรอง การรวม หรือการแสดง SQL Server มีสองฟังก์ชันสําหรับจุดประสงค์นี้:

JSON_VALUE() แยกค่าสเกลาร์ (สตริง ตัวเลข บูลีน) จากสตริง JSON:

DECLARE @json NVARCHAR(MAX) = N'{
    "customer": {
        "id": 12345,
        "name": "Contoso Ltd",
        "active": true
    },
    "orderTotal": 1599.99
}';

SELECT 
    JSON_VALUE(@json, '$.customer.id') AS CustomerID,
    JSON_VALUE(@json, '$.customer.name') AS CustomerName,
    JSON_VALUE(@json, '$.orderTotal') AS OrderTotal;

ชุดผลลัพธ์จะเป็น:

CustomerID   CustomerName   OrderTotal
----------   ------------   ----------
12345        Contoso Ltd    1599.99

ฟังก์ชันจะนําทางโครงสร้าง JSON โดยใช้นิพจน์เส้นทางและส่งคืนค่าเป็น NVARCHAR(4000) สตริง คุณสามารถส่งผลลัพธ์ไปยังชนิดข้อมูลอื่นได้ตามต้องการสําหรับการคํานวณหรือการเปรียบเทียบ

JSON_QUERY() แยกออบเจ็กต์หรืออาร์เรย์ JSON (ค่าที่ไม่ใช่สเกลา):

DECLARE @json NVARCHAR(MAX) = N'{
    "customer": {
        "id": 12345,
        "name": "Contoso Ltd"
    },
    "items": [
        {"product": "Widget", "qty": 5},
        {"product": "Gadget", "qty": 3}
    ]
}';

SELECT 
    JSON_QUERY(@json, '$.customer') AS CustomerObject,
    JSON_QUERY(@json, '$.items') AS ItemsArray;

ชุดผลลัพธ์จะเป็น:

CustomerObject                          ItemsArray
--------------------------------------  ------------------------------------------------
{"id": 12345,"name": "Contoso Ltd"}     [{"product": "Widget", "qty": 5},{"product": "Gadget", "qty": 3}]

ซึ่งแตกต่างจาก JSON_VALUE()รักษา JSON_QUERY() โครงสร้าง JSON โดยส่งคืนออบเจ็กต์และอาร์เรย์เป็นสตริง JSON ที่ถูกต้องซึ่งคุณสามารถจัดเก็บ ส่งผ่านไปยังฟังก์ชันอื่น หรือกลับไปยังแอปพลิเคชันได้

นิพจน์เส้นทางใช้เพื่อ $ แสดงองค์ประกอบราก โดยมีสัญกรณ์จุดสําหรับคุณสมบัติที่ซ้อนกันและสัญกรณ์วงเล็บสําหรับองค์ประกอบอาร์เรย์ ดังในตัวอย่างต่อไปนี้:

-- Access array elements by index (0-based)
SELECT JSON_VALUE(@json, '$.items[0].product') AS FirstProduct;

ผลลัพธ์จะเป็น:

FirstProduct
------------
Widget

ดัชนีอาร์เรย์เริ่มต้นที่ 0 ดังนั้นจึง $.items[0] หมายถึงองค์ประกอบแรก ใช้ไวยากรณ์นี้เพื่อแยกรายการเฉพาะเมื่อคุณทราบตําแหน่ง หรือรวมกับ OPENJSON เมื่อคุณต้องการประมวลผลองค์ประกอบอาร์เรย์ทั้งหมด

เคล็ดลับ

ใช้ JSON_VALUE() เมื่อคุณต้องการค่าสเกลาสําหรับการเปรียบเทียบหรือการคํานวณ ใช้ JSON_QUERY() เมื่อคุณต้องการรักษาโครงสร้าง JSON ของออบเจ็กต์หรืออาร์เรย์ที่ซ้อนกัน

แยกวิเคราะห์อาร์เรย์ JSON ด้วย OPENJSON

OPENJSON เป็นฟังก์ชันที่มีค่าตารางที่แปลงข้อมูล JSON เป็นชุดแถวเชิงสัมพันธ์ ใช้ฟังก์ชันนี้เพื่อรวมข้อมูล JSON กับตารางเชิงสัมพันธ์หรือองค์ประกอบอาร์เรย์กระบวนการทีละรายการ

คิวรีต่อไปนี้แยกวิเคราะห์อาร์เรย์ JSON เป็นแถวที่มี Schema เริ่มต้น:

DECLARE @json NVARCHAR(MAX) = N'[
    {"id": 1, "name": "Widget", "price": 29.99},
    {"id": 2, "name": "Gadget", "price": 49.99},
    {"id": 3, "name": "Gizmo", "price": 19.99}
]';

SELECT * FROM OPENJSON(@json);

ชุดผลลัพธ์จะเป็น:

key   value                                          type
---   --------------------------------------------   ----
0     {"id": 1, "name": "Widget", "price": 29.99}   5
1     {"id": 2, "name": "Gadget", "price": 49.99}   5
2     {"id": 3, "name": "Gizmo", "price": 19.99}    5

หากไม่มี Schema จะ OPENJSON ส่งกลับสามคอลัมน์ ได้แก่ key (ดัชนีอาร์เรย์หรือชื่อคุณสมบัติ) value (เนื้อหา JSON) และ type (ตัวเลขที่ระบุชนิดข้อมูล JSON: 0=null, 1=string, 2=number, 3=boolean, 4=array, 5=object)

คิวรีต่อไปนี้กําหนด Schema ที่ชัดเจนเพื่อแยกคอลัมน์เฉพาะที่มีชนิดข้อมูลที่เหมาะสม:

SELECT 
    ProductID,
    ProductName,
    Price
FROM OPENJSON(@json)
WITH (
    ProductID INT '$.id',
    ProductName NVARCHAR(100) '$.name',
    Price DECIMAL(10,2) '$.price'
);

ชุดผลลัพธ์จะเป็น:

ProductID   ProductName   Price
---------   -----------   ------
1           Widget        29.99
2           Gadget        49.99
3           Gizmo         19.99

WITHส่วนคําสั่งแมปคุณสมบัติ JSON กับคอลัมน์ที่พิมพ์ วิธีการนี้ให้ชนิดข้อมูลที่เหมาะสมสําหรับการคํานวณและการเปรียบเทียบ และให้คุณเลือกเฉพาะคุณสมบัติที่คุณต้องการเท่านั้น

รวม OPENJSON กับข้อมูลตารางโดยใช้ CROSS APPLY:

-- Assuming Orders table has a JSON column called OrderDetails
SELECT 
    o.OrderID,
    o.CustomerID,
    items.ProductName,
    items.Quantity,
    items.UnitPrice
FROM Orders AS o
CROSS APPLY OPENJSON(o.OrderDetails)
WITH (
    ProductName NVARCHAR(100) '$.product',
    Quantity INT '$.qty',
    UnitPrice DECIMAL(10,2) '$.price'
) AS items;

Note

เมื่อโค้ดใช้ OPENJSON กับ CROSS APPLYแถวจากตารางหลักที่มี NULL ค่า JSON หรือว่างเปล่าจะไม่ปรากฏในผลลัพธ์ ใช้ OUTER APPLY หากคุณต้องการรวมแถวที่ไม่มีข้อมูล JSON

สร้าง JSON ด้วย JSON_OBJECT และ JSON_ARRAY

เปิดตัว JSON_OBJECT SQL Server 2022 และ JSON_ARRAY ฟังก์ชันสําหรับการสร้าง JSON ที่ใช้งานง่าย:

JSON_OBJECT() สร้างออบเจ็กต์ JSON จากคู่คีย์-ค่า ตัวอย่างต่อไปนี้แสดงวิธีการสร้างออบเจ็กต์ JSON สําหรับผลิตภัณฑ์:

SELECT JSON_OBJECT(
    'id': ProductID,
    'name': Name,
    'price': ListPrice,
    'available': CASE WHEN SellEndDate IS NULL THEN 'true' ELSE 'false' END
) AS ProductJson
FROM SalesLT.Product
WHERE ProductID = 680;

ผลลัพธ์จะเป็น:

ProductJson
---------------------------------------------------------------------------
{"id":680,"name":"HL Road Frame - Black, 58","price":1431.50,"available":"true"}

ฟังก์ชันนี้จะจัดการการแปลงประเภทข้อมูลและการหลบหลีก JSON ที่เหมาะสมสําหรับอักขระพิเศษในค่าสตริงโดยอัตโนมัติ

JSON_ARRAY() สร้างอาร์เรย์ JSON จากค่า ตัวอย่างต่อไปนี้สร้างอาร์เรย์ JSON:

SELECT JSON_ARRAY(
    'SQL Server',
    'Azure SQL Database',
    'SQL Database in Fabric'
) AS Platforms;

ผลลัพธ์จะเป็น:

Platforms
---------------------------------------------------------
["SQL Server","Azure SQL Database","SQL Database in Fabric"]

คุณสามารถส่งค่าคอลัมน์ ตัวแปร หรือค่าสัญพจน์ไปยังJSON_ARRAY() ฟังก์ชันจะสร้างอาร์เรย์ JSON ที่จัดรูปแบบอย่างถูกต้องโดยไม่คํานึงถึงประเภทอินพุต

จากนั้นรวมฟังก์ชันเหล่านี้เพื่อสร้างโครงสร้าง JSON ที่ซ้อนกัน ตัวอย่างต่อไปนี้สร้างออบเจ็กต์ JSON ของคําสั่งซื้อที่สมบูรณ์ด้วยข้อมูลลูกค้าและข้อมูลรวม:

SELECT JSON_OBJECT(
    'orderId': soh.SalesOrderID,
    'orderDate': soh.OrderDate,
    'customer': JSON_OBJECT(
        'id': c.CustomerID,
        'name': c.CompanyName
    ),
    'totals': JSON_OBJECT(
        'subtotal': soh.SubTotal,
        'tax': soh.TaxAmt,
        'total': soh.TotalDue
    )
) AS OrderJson
FROM SalesLT.SalesOrderHeader AS soh
INNER JOIN SalesLT.Customer AS c
    ON soh.CustomerID = c.CustomerID
WHERE soh.SalesOrderID = 71774;

ผลลัพธ์จะเป็น:

OrderJson
--------------------------------------------------------------------------------
{"orderId":71774,"orderDate":"2008-06-01","customer":{"id":29825,"name":"Contoso"},"totals":{"subtotal":880.35,"tax":70.43,"total":972.79}}

JSON_OBJECTการเรียกซ้อนจะสร้างโครงสร้างลําดับชั้นที่ตรงกับรูปแบบที่คาดไว้ของแอปพลิเคชัน วิธีนี้สะอาดกว่าการต่อสตริงและรับประกันเอาต์พุต JSON ที่ถูกต้อง

รวมข้อมูลด้วย JSON_ARRAYAGG

JSON_ARRAYAGG รวมค่าจากหลายแถวเป็นอาร์เรย์ JSON เดียว ฟังก์ชันนี้มีประโยชน์สําหรับการสร้างเอาต์พุต JSON ที่ไม่เป็นมาตรฐานจากข้อมูลเชิงสัมพันธ์ที่ทําให้เป็นมาตรฐาน:

SELECT 
    c.CustomerID,
    c.CompanyName,
    JSON_ARRAYAGG(soh.SalesOrderID) AS OrderIds
FROM SalesLT.Customer AS c
INNER JOIN SalesLT.SalesOrderHeader AS soh
    ON c.CustomerID = soh.CustomerID
GROUP BY c.CustomerID, c.CompanyName;

ผลลัพธ์จะเป็น:

CustomerID   CompanyName           OrderIds
----------   -------------------   ------------------
29825        Contoso Retail        [71774,71776,71780]
29847        Adventure Works       [71782,71784]

ฟังก์ชันจะรวบรวมค่าที่ตรงกันทั้งหมดจากแถวที่จัดกลุ่มและรวมเป็นอาร์เรย์ JSON เดียว วิธีนี้มีประโยชน์สําหรับการสร้างการตอบสนอง API ที่ไม่เป็นมาตรฐานจากตารางฐานข้อมูลที่ทําให้เป็นมาตรฐาน

คุณสามารถรวม JSON_ARRAYAGG กับ JSON_OBJECT เพื่อสร้างอาร์เรย์ของวัตถุที่ซับซ้อน:

SELECT 
    pc.Name AS Category,
    JSON_ARRAYAGG(
        JSON_OBJECT(
            'id': p.ProductID,
            'name': p.Name,
            'price': p.ListPrice
        )
    ) AS Products
FROM SalesLT.ProductCategory AS pc
INNER JOIN SalesLT.Product AS p
    ON pc.ProductCategoryID = p.ProductCategoryID
GROUP BY pc.ProductCategoryID, pc.Name;

ผลลัพธ์ต่อไปนี้จะเป็น:

Category        Products
--------------  --------------------------------------------------------------------------
Road Bikes      [{"id":749,"name":"Road-150 Red, 62","price":3578.27},{"id":750,"name":"Road-150 Red, 44","price":3578.27}]
Mountain Bikes  [{"id":771,"name":"Mountain-100 Silver, 38","price":3399.99},{"id":772,"name":"Mountain-100 Black, 38","price":3374.99}]

สำคัญ

JSON_ARRAYAGG และ JSON_OBJECT/JSON_ARRAY ฟังก์ชันพร้อมใช้งานใน SQL Server 2022 และใหม่กว่า, ฐานข้อมูล Azure SQL และฐานข้อมูล SQL ใน Microsoft Fabric สําหรับเวอร์ชันก่อนหน้า ให้ใช้ FOR JSON PATH สําหรับฟังก์ชันการทํางานที่คล้ายกัน

ตรวจสอบและตรวจสอบ JSON ด้วย JSON_CONTAINS

ข้อมูล JSON จากแหล่งข้อมูลภายนอกอาจมีรูปแบบไม่ถูกต้อง ขาดคุณสมบัติที่คาดไว้ หรือมีค่าที่ไม่คาดคิด การพยายามแยกค่าจาก JSON ที่ไม่ถูกต้องหรือเส้นทางที่ขาดหายไปอาจทําให้เกิดความล้มเหลวในการสืบค้นหรือส่งคืนผลลัพธ์ที่ทําให้ NULL เข้าใจผิดซึ่งปกปิดปัญหาข้อมูล

การประมวลผล JSON ที่มีประสิทธิภาพจําเป็นต้องมีการเข้ารหัสเชิงป้องกัน: ตรวจสอบว่า JSON มีรูปแบบที่ดีก่อนที่จะแยกวิเคราะห์ จากนั้นตรวจสอบว่ามีเส้นทางที่คาดไว้อยู่ก่อนที่จะแยกค่า และตรวจสอบว่าค่าตรงกับความคาดหวังของคุณก่อนที่จะใช้ในตรรกะทางธุรกิจ SQL Server มีฟังก์ชันหลายอย่างเพื่อช่วยคุณตรวจสอบความถูกต้องของเนื้อหา JSON ในแต่ละขั้นตอนของการประมวลผล

ทําความเข้าใจโหมดเส้นทางที่หละหลวมและเข้มงวด

คุณสามารถใช้นิพจน์เส้นทาง JSON ใน 2 โหมดที่ควบคุมการจัดการข้อผิดพลาด

DECLARE @json NVARCHAR(MAX) = N'{"name": "Widget", "price": 29.99}';

-- Lax mode (default): Returns NULL for missing paths
SELECT JSON_VALUE(@json, 'lax $.description') AS LaxResult;

-- Strict mode: Raises an error for missing paths
SELECT JSON_VALUE(@json, 'strict $.description') AS StrictResult;

ผลลัพธ์จะเป็น:

LaxResult
---------
NULL

-- Strict mode raises: Property cannot be found on the specified JSON path.

ใช้laxโหมด (ค่าเริ่มต้น) เมื่อคาดว่าจะมีคุณสมบัติขาดหายไปและควรส่งคืนNULL ใช้ strict โหมดเมื่อคุณสมบัติที่ขาดหายไปบ่งชี้ถึงปัญหาข้อมูลที่ควรทําให้เกิดข้อผิดพลาด

ISJSON ตรวจสอบว่าสตริงมี JSON ที่ถูกต้องหรือไม่ ตัวอย่างต่อไปนี้แสดงวิธีใช้ ISJSON:

SELECT 
    ISJSON('{"name": "test"}') AS ValidJson,      -- Returns 1
    ISJSON('not valid json') AS InvalidJson,       -- Returns 0
    ISJSON(NULL) AS NullJson;                      -- Returns NULL

ผลลัพธ์จะเป็น:

ValidJson   InvalidJson   NullJson
---------   -----------   --------
1           0             NULL

หากต้องการจัดการข้อมูลที่ไม่ถูกต้องอย่างสง่างาม ให้ใช้ISJSONWHEREในส่วนคําสั่งเพื่อกรองแถวที่มี JSON ที่ถูกต้องหรือในCASEนิพจน์

JSON_PATH_EXISTS ตรวจสอบว่ามีเส้นทางเฉพาะอยู่ในเอกสาร JSON หรือไม่ เช่น ตัวอย่างต่อไปนี้:

DECLARE @json NVARCHAR(MAX) = N'{"customer": {"name": "Contoso", "tier": "Gold"}}';

SELECT 
    JSON_PATH_EXISTS(@json, '$.customer.name') AS HasName,
    JSON_PATH_EXISTS(@json, '$.customer.email') AS HasEmail;

ผลลัพธ์จะเป็น:

HasName   HasEmail
-------   --------
1         0

ฟังก์ชันนี้ส่งกลับ 1 หากมีเส้นทาง 0 หากไม่มี ใช้ก่อนเรียกใช้ JSON_VALUE ในโหมดเข้มงวด หรือเพื่อประมวลผล JSON ตามเงื่อนไขที่มีโครงสร้างที่แตกต่างกัน

ใช้เพื่อ JSON_CONTAINS ตรวจสอบว่าเอกสาร JSON มีค่าหรือออบเจ็กต์ที่เฉพาะเจาะจงหรือไม่ เช่น ตัวอย่างต่อไปนี้:

DECLARE @json NVARCHAR(MAX) = N'{"tags": ["sql", "database", "azure"]}';

SELECT 
    JSON_CONTAINS(@json, '"sql"', '$.tags') AS HasSqlTag,
    JSON_CONTAINS(@json, '"python"', '$.tags') AS HasPythonTag;

ผลลัพธ์จะเป็น:

HasSqlTag   HasPythonTag
---------   ------------
1           0

เพิ่มประสิทธิภาพการสืบค้น JSON ด้วยคอลัมน์ที่คํานวณ

เมื่อคุณสืบค้นคุณสมบัติ JSON ที่เฉพาะเจาะจงบ่อยๆ กลไกจัดการฐานข้อมูลจะต้องแยกวิเคราะห์เอกสาร JSON สําหรับทุกแถวในทุกการสืบค้น สําหรับตารางที่มีแถวหลายพันหรือหลายล้านแถว การแยกวิเคราะห์ซ้ําๆ นี้จะสร้างค่าใช้จ่ายที่สําคัญ คอลัมน์ที่คํานวณช่วยให้คุณสามารถแยกค่า JSON ได้เพียงครั้งเดียวและจัดเก็บในรูปแบบที่สืบค้นได้ซึ่งรองรับการจัดทําดัชนี

เหตุใดการแยกวิเคราะห์ JSON จึงส่งผลต่อประสิทธิภาพ

พิจารณาตารางที่มีเรกคอร์ดผลิตภัณฑ์ 100,000 รายการ โดยแต่ละแถวมีเอกสาร JSON ที่มีแอตทริบิวต์ผลิตภัณฑ์ การกรองแบบสอบถามตามประเภทต้อง:

  1. อ่านแต่ละแถวจากตาราง
  2. เมื่อต้องการค้นหาคุณสมบัติประเภท ให้แยกวิเคราะห์เอกสาร JSON
  3. แยกและเปรียบเทียบค่า

หากไม่มีการเพิ่มประสิทธิภาพ แม้แต่ตัวกรองธรรมดาก็ต้องมีการสแกนตารางทั้งหมดด้วยการแยกวิเคราะห์ JSON ในทุกแถว

สร้างคอลัมน์ที่คํานวณสําหรับคุณสมบัติ JSON

คอลัมน์ที่คํานวณจะแยกคุณสมบัติ JSON โดยอัตโนมัติและทําให้พร้อมใช้งานเป็นคอลัมน์ปกติ ดังตัวอย่างต่อไปนี้:

-- Add a computed column that extracts a JSON property
ALTER TABLE Products
ADD ProductCategory AS JSON_VALUE(ProductData, '$.category');

-- The column is now available in queries
SELECT ProductID, ProductName, ProductCategory
FROM Products
WHERE ProductCategory = 'Electronics';

ผลลัพธ์จะเป็น:

ProductID   ProductName           ProductCategory
---------   -------------------   ---------------
101         Wireless Mouse        Electronics
102         USB Keyboard          Electronics
103         HD Monitor            Electronics

โดยค่าเริ่มต้น คอลัมน์ที่คํานวณจะเป็นแบบเสมือน ฐานข้อมูลจะคํานวณค่า ณ เวลาสืบค้น แต่สามารถเพิ่มประสิทธิภาพการแยก JSON ได้ เพื่อประสิทธิภาพที่ดียิ่งขึ้น คุณสามารถคงคอลัมน์ที่คํานวณไว้ได้ดังในตัวอย่างต่อไปนี้:

-- Persisted computed column stores the extracted value physically
ALTER TABLE Products
ADD ProductCategory AS JSON_VALUE(ProductData, '$.category') PERSISTED;

คอลัมน์ที่คงอยู่จะเก็บค่าที่แยกออกมาบนดิสก์ ดังนั้น JSON จะถูกแยกวิเคราะห์เฉพาะระหว่างINSERTUPDATEและการดําเนินการ ไม่ใช่ระหว่างSELECTการสืบค้น

เพิ่มดัชนีเพื่อการกรองที่เร็วขึ้น

ประสิทธิภาพที่แท้จริงมาจากการจัดทําดัชนีคอลัมน์ที่คํานวณ:

-- Create an index on the computed column
CREATE INDEX IX_Products_Category ON Products(ProductCategory);

-- Now this query uses an index seek instead of a table scan
SELECT ProductID, ProductName
FROM Products
WHERE ProductCategory = 'Electronics';

หากไม่มีดัชนี แบบสอบถามจะสแกนแถวทั้งหมด 100,000 แถว ด้วยดัชนี กลไกจัดการแบบสอบถามจะทําการค้นหาดัชนีและดึงข้อมูลเฉพาะแถวที่ตรงกันเท่านั้น ดัชนีนี้สามารถลดเวลาการสืบค้นจากวินาทีเป็นมิลลิวินาที

จัดทําดัชนีคุณสมบัติ JSON หลายรายการ

สําหรับการค้นหาที่กรองคุณสมบัติ JSON หลายรายการ ให้สร้างคอลัมน์ที่คํานวณและดัชนีแบบรวม:

-- Extract multiple properties
ALTER TABLE Products
ADD ProductCategory AS JSON_VALUE(ProductData, '$.category') PERSISTED,
    ProductBrand AS JSON_VALUE(ProductData, '$.brand') PERSISTED,
    ProductPrice AS CAST(JSON_VALUE(ProductData, '$.price') AS DECIMAL(10,2)) PERSISTED;

-- Create a composite index for common query patterns
CREATE INDEX IX_Products_Category_Brand ON Products(ProductCategory, ProductBrand);

-- Create an index for price range queries
CREATE INDEX IX_Products_Price ON Products(ProductPrice);

ตอนนี้การกรองแบบสอบถามตามหมวดหมู่และยี่ห้อ หรือการจัดเรียงตามราคา สามารถใช้ดัชนีเหล่านี้ได้อย่างมีประสิทธิภาพ

เคล็ดลับ

สําหรับคุณสมบัติ JSON ที่เข้าถึงบ่อย คอลัมน์ที่คํานวณพร้อมดัชนีสามารถปรับปรุงประสิทธิภาพการสืบค้นได้เมื่อเทียบกับการแยกวิเคราะห์ JSON ในเวลาสืบค้น ตรวจสอบรูปแบบคิวรีของคุณและสร้างคอลัมน์ที่คํานวณสําหรับคุณสมบัติที่ใช้ในส่วน WHEREคําสั่ง , JOINหรือ ORDER BY ส่วนคําสั่ง

แปลงข้อมูลเชิงสัมพันธ์เป็น JSON ด้วย FOR JSON

สําหรับเอาต์พุต JSON ที่ครอบคลุมจากคิวรี ให้ใช้ FOR JSON PATH หรือ FOR JSON AUTO:

SELECT 
    p.ProductID,
    p.Name,
    p.ListPrice,
    pc.Name AS CategoryName
FROM SalesLT.Product AS p
INNER JOIN SalesLT.ProductCategory AS pc
    ON p.ProductCategoryID = pc.ProductCategoryID
WHERE p.ListPrice > 1000
FOR JSON PATH, ROOT('products');

ผลลัพธ์จะเป็น:

{"products":[{"ProductID":749,"Name":"Road-150 Red, 62","ListPrice":3578.27,"CategoryName":"Road Bikes"},{"ProductID":750,"Name":"Road-150 Red, 44","ListPrice":3578.27,"CategoryName":"Road Bikes"}]}

FOR JSON PATH ให้คุณควบคุมโครงสร้าง JSON ผ่านนามแฝงคอลัมน์ ใช้สัญกรณ์จุดในนามแฝงเพื่อสร้างวัตถุที่ซ้อนกัน:

SELECT 
    p.ProductID AS 'product.id',
    p.Name AS 'product.name',
    pc.Name AS 'product.category'
FROM SalesLT.Product AS p
INNER JOIN SalesLT.ProductCategory AS pc
    ON p.ProductCategoryID = pc.ProductCategoryID
WHERE p.ProductID = 680
FOR JSON PATH;

ผลลัพธ์จะเป็น:

[{"product":{"id":680,"name":"HL Road Frame - Black, 58","category":"Road Frames"}}]

นามแฝง 'product.id' คอลัมน์จะสร้างออบเจ็กต์ที่ product ซ้อนกันด้วย id คุณสมบัติ เทคนิคนี้ช่วยให้คุณกําหนดรูปร่างผลลัพธ์ให้ตรงกับรูปแบบที่คาดหวังของ API โดยไม่ต้องประมวลผลภายหลัง

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน JSON ใน SQL Server โปรดดู ข้อมูล JSON ใน SQL Server และฟังก์ชัน JSON