sql >> Databasteknik >  >> RDS >> Sqlserver

OPENJSON "Felaktig syntax nära nyckelordet 'med'." i SQL Server (LÖST)

Om du försöker köra någon OPENJSON() kod i SQL Server, men du får felmeddelande 319, nivå 15 "Felaktig syntax nära nyckelordet 'med'", en möjlighet är att du verkligen har ett syntaxfel.

Men om du har kontrollerat och dubbelkollat, och du är övertygad om att det inte finns något syntaxfel, kan det faktiskt vara så att felet är en bieffekt av att ha fel databaskompatibilitetsnivå.

Normalt får du felmeddelande 208, nivå 16 "Ogiltigt objektnamn 'OPENJSON'." när du använder en databaskompatibilitetsnivå på lägre än 130, men i vissa fall hittar SQL Server ett problem med WITH klausul först.

Jag stötte på det här felet när jag körde giltig OPENJSON() kod, men på en databas där kompatibilitetsnivån bara var 120.

OPENJSON() är endast tillgänglig på databaser med en kompatibilitetsnivå på 130 eller högre.

När jag kontrollerade min databaskompatibilitetsnivå såg jag att den var 120. Jag ökade den direkt till 150 och jag fick inte längre felet.

Exempel på felet

Här är ett exempel på kod som ger det här felet när databaskompatibilitetsnivån är lägre än 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.

Åtgärda felet

Du kan enkelt åtgärda det här felet genom att ändra databasens kompatibilitetsnivå till 130 eller högre.

-- 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, om du inte vill ändra detta, kan du byta till en databas som du vet har en lämplig kompatibilitetsnivå.

Förhoppningsvis hjälper det här inlägget någon där ute som stöter på samma fel.


  1. MariaDB strängfunktioner (fullständig lista)

  2. Vad har de olympiska spelen, UEFA Euro 2016 fotbollsmatcher och databaser gemensamt?

  3. Hur man behåller data i en dockeriserad postgres-databas med hjälp av volymer

  4. Välj Data via en tabellvärderad funktion i SQL Server