Wenn Sie versuchen, OPENJSON()
auszuführen Code in SQL Server, aber Sie erhalten Fehler Msg 319, Level 15 „Falsche Syntax in der Nähe des Schlüsselworts ‚with‘“, eine Möglichkeit ist, dass Sie wirklich einen Syntaxfehler haben.
Aber wenn Sie nach und nach überprüft haben und überzeugt sind, dass kein Syntaxfehler vorliegt, könnte es tatsächlich sein, dass der Fehler ein Nebeneffekt des falschen Datenbank-Kompatibilitätsgrads ist.
Normalerweise erhalten Sie die Fehlermeldung 208, Stufe 16 „Ungültiger Objektname ‚OPENJSON‘.“ wenn Sie einen Datenbank-Kompatibilitätsgrad von weniger als 130 verwenden, aber in einigen Fällen findet SQL Server ein Problem mit dem WITH
Klausel zuerst.
Ich bin auf diesen Fehler gestoßen, als ich gültiges OPENJSON()
ausgeführt habe Code, aber auf einer Datenbank, wo der Kompatibilitätsgrad nur 120 war.
OPENJSON()
ist nur für Datenbanken mit einem Kompatibilitätsgrad von 130 oder höher verfügbar.
Als ich meinen Datenbank-Kompatibilitätsgrad überprüfte, sah ich, dass er 120 war. Ich erhöhte ihn sofort auf 150 und bekam den Fehler nicht mehr.
Beispiel für den Fehler
Hier ist ein Codebeispiel, das diesen Fehler erzeugt, wenn der Kompatibilitätsgrad der Datenbank niedriger als 130 ist.
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)
);
Ergebnis:
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.
Fehler beheben
Sie können diesen Fehler einfach beheben, indem Sie den Kompatibilitätsgrad der Datenbank auf 130 oder höher ändern.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Ergebnis:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Wenn Sie dies nicht ändern möchten, können Sie alternativ zu einer Datenbank wechseln, von der Sie wissen, dass sie einen geeigneten Kompatibilitätsgrad hat.
Hoffentlich hilft dieser Beitrag jemandem da draußen, der auf denselben Fehler stößt.