Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

OPENJSON „Falsche Syntax in der Nähe des Schlüsselworts ‚with‘.“ in SQL Server (GELÖST)

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.