Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

OPENJSON "Sintassi errata vicino alla parola chiave 'con'." in SQL Server (RISOLTO)

Se stai cercando di eseguire alcuni OPENJSON() codice in SQL Server, ma stai ricevendo un messaggio di errore 319, livello 15 "Sintassi errata vicino alla parola chiave 'con'", una possibilità è che tu abbia davvero un errore di sintassi.

Ma se hai controllato e ricontrollato e sei convinto che non ci siano errori di sintassi, potrebbe effettivamente essere che l'errore sia un effetto collaterale dell'avere il livello di compatibilità del database sbagliato.

Normalmente avresti ricevuto l'errore Msg 208, livello 16 "Nome oggetto non valido 'OPENJSON'." quando si utilizza un livello di compatibilità del database inferiore a 130, ma in alcuni casi SQL Server rileva un problema con WITH prima la clausola.

Ho riscontrato questo errore durante l'esecuzione di OPENJSON() valido codice, ma su un database in cui il livello di compatibilità era solo 120.

OPENJSON() è disponibile solo su database con un livello di compatibilità pari o superiore a 130.

Quando ho verificato il livello di compatibilità del mio database, ho visto che era 120. L'ho immediatamente aumentato a 150 e non ho più ricevuto l'errore.

Esempio di errore

Ecco un esempio di codice che produce questo errore quando il livello di compatibilità del database è inferiore a 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)
    );

Risultato:

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.

Correggi l'errore

Puoi correggere facilmente questo errore modificando il livello di compatibilità del database su 130 o superiore.

-- Change compatibility level
ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150;

-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';

Risultato:

+-----------------------+
| compatibility_level   |
|-----------------------|
| 150                   |
+-----------------------+

In alternativa, se non vuoi cambiarlo, puoi passare a un database che sai avere un livello di compatibilità adeguato.

Speriamo che questo post aiuti qualcuno là fuori che riscontra lo stesso errore.