Trong SQL Server, bạn có thể sử dụng T-SQL JSON_MODIFY()
hàm để sửa đổi giá trị của một thuộc tính trong một chuỗi JSON. Hàm trả về chuỗi JSON đã cập nhật.
Cú pháp
Cú pháp như sau:
JSON_MODIFY ( expression , path , newValue )
Ở đâu expression
là biểu thức chuỗi JSON, path
là đường dẫn đến thuộc tính bạn muốn cập nhật và newValue
là giá trị mới để áp dụng cho thuộc tính đó.
Ví dụ 1 - Cách sử dụng cơ bản
Đây là một ví dụ để chứng minh.
SELECT JSON_MODIFY('{"Name": "Homer"}', '$.Name', 'Bart') AS 'Result';
Kết quả:
+------------------+ | Result | |------------------| | {"Name": "Bart"} | +------------------+
Trong ví dụ này:
-
{"Name": "Homer"}
là chuỗi JSON ban đầu -
$.Name
là đường dẫn (bắt đầu bằng$.
theo sau là đường dẫn đến thuộc tính mà chúng tôi muốn cập nhật). -
Bart
là giá trị mới mà chúng tôi muốn gán choName
(tức là thay thế giá trị hiện tại)
Ví dụ 2 - Trả lại JSON gốc và đã sửa đổi
Lưu ý rằng JSON_MODIFY()
không sửa đổi JSON gốc. Nó cần một bản sao, sau đó sửa đổi và trả lại bản sao.
Dưới đây là một ví dụ để chứng minh điều này:
DECLARE @suspect NVARCHAR(4000) SET @suspect= '{"Name": "Homer"}' SELECT @suspect AS 'Original String', JSON_MODIFY(@suspect, '$.Name', 'Bart') AS 'Modified String', @suspect AS 'Original String';
Kết quả:
+-------------------+-------------------+-------------------+ | Original String | Modified String | Original String | |-------------------+-------------------+-------------------| | {"Name": "Homer"} | {"Name": "Bart"} | {"Name": "Homer"} | +-------------------+-------------------+-------------------+
Ví dụ 3 - Thuộc tính lồng nhau
Đường dẫn có thể sử dụng ký hiệu dấu chấm để tham chiếu các thuộc tính lồng nhau. Đây là một ví dụ.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Address.City', 'Timaru') AS 'Modified Array';
Kết quả:
+------------------+ | Modified Array | |------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Timaru", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } } | +------------------+
Vì vậy, chúng ta có thể thấy rằng thành phố đã được thay đổi từ Dunedin
tới Timaru
.
Ví dụ 4 - Cập nhật các giá trị trong một mảng
Bạn cũng có thể cập nhật các giá trị trong một mảng. Trong ví dụ này, chúng tôi cập nhật một giá trị trong Hobbies
mảng.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Hobbies[2]', 'Brain Surgery') AS 'Updated Hobbies';
Kết quả:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Brain Surgery"] } } | +-------------------+
Vì các mảng sử dụng cách đánh số dựa trên 0, chúng tôi cập nhật mục thứ ba bằng cách tham chiếu Hobbies[2]
.
Ví dụ 5 - Nối Giá trị vào Mảng
Trong ví dụ này, chúng tôi thêm một giá trị vào Hobbies
mảng. Chúng tôi thực hiện việc này bằng cách thêm append
ở đầu đối số đường dẫn.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'append $.Suspect.Hobbies', 'Brain Surgery') AS 'Updated Hobbies';
Kết quả:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping","Brain Surgery"] } } | +-------------------+
Ví dụ 6 - Cập nhật một mảng toàn bộ
Trong ví dụ này, tôi cập nhật toàn bộ mảng.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Hobbies', JSON_QUERY('["Chess", "Brain Surgery"]')) AS 'Updated Hobbies';
Kết quả:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Chess", "Brain Surgery"] } } | +-------------------+
Lưu ý rằng trong ví dụ này, đối số thứ ba được chuyển đến JSON_QUERY()
hàm số. Nếu tôi không làm điều này, SQL Server sẽ thoát khỏi dấu ngoặc kép và dấu ngoặc vuông bằng cách sử dụng dấu gạch chéo ngược (\
) ký tự (và do đó làm rối mảng). Nó sẽ làm điều này vì nó sẽ không biết liệu giá trị được cập nhật là một mảng thực tế hay một chuỗi ký tự.
Vì vậy, để giải quyết vấn đề này, chúng ta có thể sử dụng JSON_QUERY()
. Hàm này trả về JSON hợp lệ và SQL Server sau đó sẽ giả định rằng giá trị mới là một mảng.
Đây là những gì sẽ xảy ra nếu chúng tôi đã không đã sử dụng JSON_QUERY()
:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect.Hobbies', '["Chess", "Brain Surgery"]') AS 'Updated Hobbies';
Kết quả:
+-------------------+ | Updated Hobbies | |-------------------| | { "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Dunedin", "Region": "Otago", "Country": "New Zealand" }, "Hobbies": "[\"Chess\", \"Brain Surgery\"]" } } | +-------------------+
Vì vậy, SQL Server đã thoát khỏi dấu ngoặc vuông và dấu ngoặc kép.
Ví dụ 7 - Cập nhật Toàn bộ Đối tượng
Dưới đây là một ví dụ về cập nhật toàn bộ đối tượng.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect', JSON_QUERY('{"Name": "Peter Griffin", "Hobbies": "None"}')) AS 'Updated Object';
Kết quả:
+------------------+ | Updated Object | |------------------| | { "Suspect": {"Name": "Peter Griffin", "Hobbies": "None"} } | +------------------+
Một lần nữa, nếu chúng tôi chưa sử dụng JSON_QUERY()
, chúng tôi sẽ nhận được một chuỗi thoát:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_MODIFY(@data,'$.Suspect', '{"Name": "Peter Griffin", "Hobbies": "None"}') AS 'Updated Object';
Kết quả:
+------------------+ | Updated Object | |------------------| | { "Suspect": "{\"Name\": \"Peter Griffin\", \"Hobbies\": \"None\"}" } | +------------------+
Ví dụ 8 - Đổi tên khóa
Bạn không chỉ bị giới hạn trong việc cập nhật giá trị của thuộc tính, bạn cũng có thể đổi tên khóa của nó. Đây là một ví dụ.
DECLARE @data NVARCHAR(50)='{"Name":"Homer"}' PRINT @data -- Rename the key SET @data= JSON_MODIFY( JSON_MODIFY(@data,'$.Handle', JSON_VALUE(@data,'$.Name')), '$.Name', NULL ) PRINT @data
Kết quả:
{"Name":"Homer"} {"Handle":"Homer"}
Ở đây, chúng tôi lấy giá trị từ thuộc tính hiện có và gán nó vào một cặp khóa / giá trị mới. Sau đó, chúng tôi đặt giá trị của khóa gốc thành NULL
(tự động xóa nó).
Để biết thêm ví dụ về đổi tên khóa, hãy xem Cách đổi tên khóa JSON trong SQL Server.