JSON_MODIFY (T-SQL)
Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics
Memperbarui nilai properti dalam string JSON dan mengembalikan string JSON yang diperbarui.
Sintaks
JSON_MODIFY ( expression , path , newValue )
Argumen
expression
Ekspresi. Biasanya nama variabel atau kolom yang berisi teks JSON.
JSON_MODIFY
mengembalikan kesalahan jika ekspresi tidak berisi JSON yang valid.
jalan
Ekspresi jalur JSON yang menentukan properti yang akan diperbarui.
jalur memiliki sintaks berikut:
[append] [ lax | strict ] $.<json path>
Menambahkan
Pengubah opsional yang menentukan bahwa nilai baru harus ditambahkan ke array yang direferensikan oleh
<json path>
.Lax
Menentukan bahwa properti yang dirujuk oleh
<json path>
tidak harus ada. Jika properti tidak ada,JSON_MODIFY
coba sisipkan nilai baru pada jalur yang ditentukan. Penyisipan dapat gagal jika properti tidak dapat disisipkan pada jalur. Jika Anda tidak menentukan laks atau ketat, lax adalah mode default.ketat
Menentukan bahwa properti yang direferensikan oleh
<json path>
harus berada dalam ekspresi JSON. Jika properti tidak ada,JSON_MODIFY
mengembalikan kesalahan.<json path>
Menentukan jalur untuk properti yang akan diperbarui. Untuk informasi selengkapnya, lihat Ekspresi Jalur JSON (SQL Server).
Di SQL Server 2017 (14.x) dan di Azure SQL Database, Anda dapat memberikan variabel sebagai nilai jalur.
JSON_MODIFY
mengembalikan kesalahan jika format jalur tidak valid.
nilainilai baru
Nilai baru untuk properti yang ditentukan oleh jalur.
Nilai baru harus varchar, nvarchar, atau teks.
Dalam mode lax, JSON_MODIFY
menghapus kunci yang ditentukan jika nilai baru adalah NULL
.
JSON_MODIFY
lolos semua karakter khusus dalam nilai baru jika jenis nilainya adalah varchar atau nvarchar. Nilai teks tidak lolos jika JSON diformat dengan benar yang dihasilkan oleh FOR JSON
, , JSON_QUERY
atau JSON_MODIFY
.
Nilai hasil
Mengembalikan nilai ekspresi yang diperbarui sebagai teks JSON yang diformat dengan benar.
Keterangan
Fungsi ini JSON_MODIFY
memungkinkan Anda memperbarui nilai properti yang ada, menyisipkan pasangan kunci:nilai baru, atau menghapus kunci berdasarkan kombinasi mode dan nilai yang disediakan.
Tabel berikut membandingkan perilaku JSON_MODIFY
dalam mode lax dan dalam mode ketat. Untuk informasi selengkapnya tentang spesifikasi mode jalur opsional (lax atau ketat), lihat Ekspresi Jalur JSON (SQL Server).
Nilai baru | Jalur ada | Mode laks | Mode ketat |
---|---|---|---|
NOT NULL |
Ya | Perbarui nilai yang ada. | Perbarui nilai yang ada. |
NOT NULL |
No | Cobalah untuk membuat pasangan kunci-nilai baru pada jalur yang ditentukan. Ini mungkin gagal. Misalnya, jika Anda menentukan jalur $.user.setting.theme , JSON_MODIFY tidak menyisipkan kunci theme jika $.user objek atau $.user.settings tidak ada, atau jika pengaturan adalah array atau nilai skalar. |
Kesalahan - INVALID_PROPERTY |
NULL |
Ya | Hapus properti yang ada. | Atur nilai yang ada ke null. |
NULL |
No | Tidak ada tindakan. Argumen pertama dikembalikan sebagai hasilnya. | Kesalahan - INVALID_PROPERTY |
Dalam mode laks, JSON_MODIFY
coba buat pasangan kunci:nilai baru, tetapi dalam beberapa kasus mungkin gagal.
Fungsi JSON berfungsi sama apakah dokumen JSON disimpan dalam varchar, nvarchar, atau jenis data json asli.
Contoh
J. Operasi dasar
Contoh berikut menunjukkan operasi dasar yang dapat dilakukan dengan teks JSON.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Update name
SET @info = JSON_MODIFY(@info, '$.name', 'Mike');
PRINT @info;
-- Insert surname
SET @info = JSON_MODIFY(@info, '$.surname', 'Smith');
PRINT @info;
-- Set name NULL
SET @info = JSON_MODIFY(@info, 'strict $.name', NULL);
PRINT @info;
-- Delete name
SET @info = JSON_MODIFY(@info, '$.name', NULL);
PRINT @info;
-- Add skill
SET @info = JSON_MODIFY(@info, 'append $.skills', 'Azure');
PRINT @info;
Berikut set hasilnya.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL"],
"surname": "Smith"
} {
"skills": ["C#", "SQL"],
"surname": "Smith"
} {
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}
B. Beberapa pembaruan
Dengan JSON_MODIFY
, Anda hanya dapat memperbarui satu properti. Jika Anda harus melakukan beberapa pembaruan, Anda dapat menggunakan beberapa JSON_MODIFY
panggilan.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Multiple updates
SET @info = JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(@info, '$.name', 'Mike'), '$.surname', 'Smith'), 'append $.skills', 'Azure');
PRINT @info;
Berikut set hasilnya.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}
C. Mengganti nama kunci
Contoh berikut menunjukkan cara mengganti nama properti dalam teks JSON dengan JSON_MODIFY
fungsi . Pertama, Anda dapat mengambil nilai properti yang ada dan menyisipkannya sebagai pasangan kunci:nilai baru. Kemudian Anda dapat menghapus kunci lama dengan mengatur nilai properti lama ke NULL
.
DECLARE @product NVARCHAR(100) = '{"price":49.99}';
PRINT @product;
-- Rename property
SET @product = JSON_MODIFY(JSON_MODIFY(@product, '$.Price', CAST(JSON_VALUE(@product, '$.price') AS NUMERIC(4, 2))), '$.price', NULL);
PRINT @product;
Berikut set hasilnya.
{
"price": 49.99
} {
"Price": 49.99
}
Jika Anda tidak melemparkan nilai baru ke jenis numerik, JSON_MODIFY
memperlakukannya sebagai teks dan mengelilinginya dengan tanda kutip ganda.
D. Menaikkan nilai
Contoh berikut menunjukkan cara menaikkan nilai properti dalam teks JSON dengan JSON_MODIFY
fungsi . Pertama, Anda dapat mengambil nilai properti yang ada dan menyisipkannya sebagai pasangan kunci:nilai baru. Kemudian Anda dapat menghapus kunci lama dengan mengatur nilai properti lama ke NULL
.
DECLARE @stats NVARCHAR(100) = '{"click_count": 173}';
PRINT @stats;
-- Increment value
SET @stats = JSON_MODIFY(@stats, '$.click_count', CAST(JSON_VALUE(@stats, '$.click_count') AS INT) + 1);
PRINT @stats;
Berikut set hasilnya.
{
"click_count": 173
} {
"click_count": 174
}
E. Mengubah objek JSON
JSON_MODIFY
memperlakukan argumen newValue sebagai teks biasa meskipun berisi teks JSON yang diformat dengan benar. Akibatnya, output JSON dari fungsi dikelilingi dengan tanda kutip ganda dan semua karakter khusus lolos, seperti yang ditunjukkan dalam contoh berikut.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Update skills array
SET @info = JSON_MODIFY(@info, '$.skills', '["C#","T-SQL","Azure"]');
PRINT @info;
Berikut set hasilnya.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": "[\"C#\",\"T-SQL\",\"Azure\"]"
}
Untuk menghindari pelepasan otomatis, berikan newValue dengan menggunakan JSON_QUERY
fungsi . JSON_MODIFY
tahu bahwa nilai yang dikembalikan oleh JSON_QUERY
diformat dengan benar JSON, sehingga tidak lolos dari nilai.
DECLARE @info NVARCHAR(100) = '{"name":"John","skills":["C#","SQL"]}';
PRINT @info;
-- Update skills array
SET @info = JSON_MODIFY(@info, '$.skills', JSON_QUERY('["C#","T-SQL","Azure"]'));
PRINT @info;
Berikut set hasilnya.
{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": ["C#", "T-SQL", "Azure"]
}
F. Memperbarui kolom JSON
Contoh berikut memperbarui nilai properti dalam kolom tabel yang berisi JSON.
UPDATE Employee
SET jsonCol = JSON_MODIFY(jsonCol, '$.info.address.town', 'London')
WHERE EmployeeID = 17;