Jika Anda mencoba menjalankan beberapa OPENJSON()
kode di SQL Server, tetapi Anda mendapatkan kesalahan Msg 319, Level 15 "Sintaks salah di dekat kata kunci 'dengan'", satu kemungkinan adalah Anda benar-benar memiliki kesalahan sintaks.
Tetapi jika Anda telah memeriksa dan memeriksa ulang, dan Anda yakin tidak ada kesalahan sintaks, bisa jadi kesalahan tersebut adalah efek samping dari tingkat kompatibilitas database yang salah.
Biasanya Anda akan mendapatkan pesan kesalahan 208, Level 16 "Nama objek tidak valid 'OPENJSON'." ketika menggunakan tingkat kompatibilitas database lebih rendah dari 130, tetapi dalam beberapa kasus, SQL Server menemukan masalah dengan WITH
klausa pertama.
Saya mengalami kesalahan ini saat menjalankan OPENJSON()
yang valid kode, tetapi pada database di mana tingkat kompatibilitasnya hanya 120.
OPENJSON()
hanya tersedia di database dengan tingkat kompatibilitas 130 atau lebih tinggi.
Ketika saya memeriksa tingkat kompatibilitas database saya, saya melihat bahwa itu adalah 120. Saya segera meningkatkannya menjadi 150 dan saya tidak lagi mendapatkan kesalahan.
Contoh Kesalahan
Berikut adalah contoh kode yang menghasilkan kesalahan ini ketika tingkat kompatibilitas database lebih rendah dari 130.
DECLARE @json NVARCHAR(4000) = N'{
"pets" : {
"cats" : [
{ "id" : 1, "name" : "Fluffy", "sex" : "Female" },
{ "id" : 2, "name" : "Long Tail", "sex" : "Female" },
{ "id" : 3, "name" : "Scratch", "sex" : "Male" }
],
"dogs" : [
{ "id" : 1, "name" : "Fetch", "sex" : "Male" },
{ "id" : 2, "name" : "Fluffy", "sex" : "Male" },
{ "id" : 3, "name" : "Wag", "sex" : "Female" }
]
}
}'
SELECT *
FROM OPENJSON(@json, '$.pets.dogs')
WITH (
[id] int,
[name] varchar(60),
[sex] varchar(6)
);
Hasil:
Msg 319, Level 15, State 2, Line 17 Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Perbaiki Kesalahan
Anda dapat dengan mudah memperbaiki kesalahan ini dengan mengubah tingkat kompatibilitas database ke 130 atau lebih tinggi.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Hasil:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Atau, jika Anda tidak ingin mengubahnya, Anda dapat beralih ke database yang Anda tahu memiliki tingkat kompatibilitas yang sesuai.
Semoga postingan ini membantu seseorang di luar sana yang mengalami kesalahan yang sama.