Nếu bạn đang cố chạy một số OPENJSON()
mã trong SQL Server, nhưng bạn đang gặp lỗi Msg 319, Cấp 15 “Cú pháp không chính xác gần từ khóa‘ with ’”, một khả năng là bạn thực sự có lỗi cú pháp.
Nhưng nếu bạn đã kiểm tra và kiểm tra kỹ và tin rằng không có lỗi cú pháp, thì thực tế có thể lỗi đó là tác dụng phụ của việc có mức độ tương thích cơ sở dữ liệu sai.
Thông thường, bạn sẽ gặp lỗi Msg 208, Cấp 16 “Tên đối tượng‘ OPENJSON ’không hợp lệ.” khi sử dụng mức độ tương thích cơ sở dữ liệu thấp hơn 130, nhưng trong một số trường hợp, SQL Server tìm thấy sự cố với WITH
mệnh đề đầu tiên.
Tôi gặp lỗi này khi chạy OPENJSON()
hợp lệ nhưng trên cơ sở dữ liệu mà mức độ tương thích chỉ là 120.
OPENJSON()
chỉ khả dụng trên cơ sở dữ liệu có mức độ tương thích từ 130 trở lên.
Khi tôi kiểm tra mức độ tương thích cơ sở dữ liệu của mình, tôi thấy rằng nó là 120. Tôi ngay lập tức tăng nó lên 150 và tôi không còn gặp lỗi nữa.
Ví dụ về lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi này khi mức độ tương thích của cơ sở dữ liệu thấp hơn 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)
);
Kết quả:
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.
Sửa lỗi
Bạn có thể dễ dàng sửa lỗi này bằng cách thay đổi mức độ tương thích của cơ sở dữ liệu thành 130 hoặc cao hơn.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Kết quả:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Ngoài ra, nếu không muốn thay đổi điều này, bạn có thể chuyển sang cơ sở dữ liệu mà bạn biết có mức độ tương thích phù hợp.
Hy vọng rằng bài đăng này sẽ giúp ích cho ai đó đang gặp phải lỗi tương tự.