Jeśli próbujesz uruchomić OPENJSON()
w programie SQL Server, ale otrzymujesz komunikat o błędzie 319, poziom 15 „Niepoprawna składnia w pobliżu słowa kluczowego „z””, jedną z możliwości jest to, że naprawdę wystąpił błąd składni.
Ale jeśli sprawdziłeś i dwukrotnie sprawdziłeś, i jesteś przekonany, że nie ma błędu składni, może to oznaczać, że błąd jest efektem ubocznym niewłaściwego poziomu zgodności bazy danych.
Normalnie otrzymasz komunikat o błędzie 208, poziom 16 „Nieprawidłowa nazwa obiektu „OPENJSON”. podczas korzystania z poziomu zgodności bazy danych niższego niż 130, ale w niektórych przypadkach SQL Server znajduje problem z WITH
najpierw klauzula.
Napotkałem ten błąd podczas uruchamiania prawidłowego OPENJSON()
kodu, ale w bazie danych, w której poziom zgodności wynosił tylko 120.
OPENJSON()
jest dostępny tylko w bazach danych o poziomie zgodności 130 lub wyższym.
Kiedy sprawdziłem poziom zgodności mojej bazy danych, zobaczyłem, że wynosi 120. Od razu zwiększyłem go do 150 i już nie otrzymuję błędu.
Przykład błędu
Oto przykład kodu, który powoduje ten błąd, gdy poziom zgodności bazy danych jest niższy niż 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)
);
Wynik:
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.
Napraw błąd
Możesz łatwo naprawić ten błąd, zmieniając poziom zgodności bazy danych na 130 lub wyższy.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Wynik:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Alternatywnie, jeśli nie chcesz tego zmieniać, możesz przełączyć się na bazę danych, o której wiesz, że ma odpowiedni poziom zgodności.
Mam nadzieję, że ten post pomoże komuś, kto napotka ten sam błąd.