Als u een aantal OPENJSON()
. probeert uit te voeren code in SQL Server, maar je krijgt foutmelding Msg 319, Level 15 "Onjuiste syntaxis bij het trefwoord 'met'", een mogelijkheid is dat je echt een syntaxisfout hebt.
Maar als je het hebt gecontroleerd en nog een keer hebt gecontroleerd, en je bent ervan overtuigd dat er geen syntaxisfout is, kan het zijn dat de fout een bijwerking is van het verkeerde databasecompatibiliteitsniveau.
Normaal gesproken krijgt u foutbericht 208, niveau 16 "Ongeldige objectnaam 'OPENJSON'." bij gebruik van een databasecompatibiliteitsniveau van lager dan 130, maar in sommige gevallen vindt SQL Server een probleem met de WITH
clausule eerst.
Ik ben deze fout tegengekomen bij het uitvoeren van geldige OPENJSON()
code, maar op een database waar het compatibiliteitsniveau slechts 120 was.
OPENJSON()
is alleen beschikbaar voor databases met een compatibiliteitsniveau van 130 of hoger.
Toen ik mijn databasecompatibiliteitsniveau controleerde, zag ik dat het 120 was. Ik verhoogde het onmiddellijk naar 150 en ik kreeg de fout niet meer.
Voorbeeld van de fout
Hier is een voorbeeld van code die deze fout produceert wanneer het compatibiliteitsniveau van de database lager is dan 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)
);
Resultaat:
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.
Verhelp de fout
U kunt deze fout eenvoudig oplossen door het compatibiliteitsniveau van de database te wijzigen in 130 of hoger.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Resultaat:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Als u dit niet wilt wijzigen, kunt u ook overschakelen naar een database waarvan u weet dat deze een geschikt compatibiliteitsniveau heeft.
Hopelijk helpt dit bericht iemand die dezelfde fout tegenkomt.