Hvis du prøver at køre nogle OPENJSON()
kode i SQL Server, men du får fejlmeddelelse 319, niveau 15 "Forkert syntaks nær nøgleordet 'med'", en mulighed er, at du virkelig har en syntaksfejl.
Men hvis du har tjekket og dobbelttjekket, og du er overbevist om, at der ikke er nogen syntaksfejl, kan det faktisk være, at fejlen er en bivirkning af at have det forkerte databasekompatibilitetsniveau.
Normalt vil du få fejlmeddelelse 208, niveau 16 "Ugyldigt objektnavn 'OPENJSON'." når du bruger et databasekompatibilitetsniveau på lavere end 130, men i nogle tilfælde finder SQL Server et problem med WITH
klausul først.
Jeg stødte på denne fejl, da jeg kørte gyldig OPENJSON()
kode, men på en database, hvor kompatibilitetsniveauet kun var 120.
OPENJSON()
er kun tilgængelig på databaser med et kompatibilitetsniveau på 130 eller højere.
Da jeg tjekkede mit databasekompatibilitetsniveau, så jeg, at det var 120. Jeg øgede det straks til 150, og jeg fik ikke længere fejlen.
Eksempel på fejlen
Her er et eksempel på kode, der producerer denne fejl, når databasekompatibilitetsniveauet er lavere end 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.
Ret fejlen
Du kan nemt rette denne fejl ved at ændre databasens kompatibilitetsniveau til 130 eller højere.
-- 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, hvis du ikke ønsker at ændre dette, kan du skifte til en database, som du ved har et passende kompatibilitetsniveau.
Forhåbentlig hjælper dette indlæg nogen derude, der støder på den samme fejl.