Om du försöker köra någon OPENJSON()
kod i SQL Server, men du får felmeddelande 319, nivå 15 "Felaktig syntax nära nyckelordet 'med'", en möjlighet är att du verkligen har ett syntaxfel.
Men om du har kontrollerat och dubbelkollat, och du är övertygad om att det inte finns något syntaxfel, kan det faktiskt vara så att felet är en bieffekt av att ha fel databaskompatibilitetsnivå.
Normalt får du felmeddelande 208, nivå 16 "Ogiltigt objektnamn 'OPENJSON'." när du använder en databaskompatibilitetsnivå på lägre än 130, men i vissa fall hittar SQL Server ett problem med WITH
klausul först.
Jag stötte på det här felet när jag körde giltig OPENJSON()
kod, men på en databas där kompatibilitetsnivån bara var 120.
OPENJSON()
är endast tillgänglig på databaser med en kompatibilitetsnivå på 130 eller högre.
När jag kontrollerade min databaskompatibilitetsnivå såg jag att den var 120. Jag ökade den direkt till 150 och jag fick inte längre felet.
Exempel på felet
Här är ett exempel på kod som ger det här felet när databaskompatibilitetsnivån är lägre ä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)
);
Resultat:
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.
Åtgärda felet
Du kan enkelt åtgärda det här felet genom att ändra databasens kompatibilitetsnivå till 130 eller högre.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Resultat:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Alternativt, om du inte vill ändra detta, kan du byta till en databas som du vet har en lämplig kompatibilitetsnivå.
Förhoppningsvis hjälper det här inlägget någon där ute som stöter på samma fel.