sql >> Database >  >> RDS >> Sqlserver

OPENJSON "Onjuiste syntaxis in de buurt van het trefwoord 'met'." in SQL Server (OPGELOST)

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.


  1. Wanneer moet ik een samengestelde index gebruiken?

  2. 3 manieren om het schema van een resultatenset in SQL Server te krijgen

  3. Prestatieoverwegingen voor tijdelijke gegevens in Oracle

  4. Wanneer hebben kolom- of tabelnamen van Postgres aanhalingstekens nodig en wanneer niet?