sql >> Base de Datos >  >> RDS >> Sqlserver

OPENJSON "Sintaxis incorrecta cerca de la palabra clave 'con'". en SQL Server (SOLUCIONADO)

Si está intentando ejecutar OPENJSON() código en SQL Server, pero recibe el mensaje de error 319, nivel 15 "Sintaxis incorrecta cerca de la palabra clave 'con'", una posibilidad es que realmente tenga un error de sintaxis.

Pero si revisó una y otra vez y está convencido de que no hay ningún error de sintaxis, en realidad podría ser que el error sea un efecto secundario de tener un nivel de compatibilidad de base de datos incorrecto.

Normalmente obtendría el mensaje de error 208, nivel 16 "Nombre de objeto no válido 'OPENJSON'". cuando se usa un nivel de compatibilidad de base de datos inferior a 130, pero en algunos casos, SQL Server encuentra un problema con WITH primera cláusula.

Encontré este error al ejecutar un OPENJSON() válido código, pero en una base de datos donde el nivel de compatibilidad era solo 120.

OPENJSON() solo está disponible en bases de datos con un nivel de compatibilidad de 130 o superior.

Cuando verifiqué el nivel de compatibilidad de mi base de datos, vi que era 120. Inmediatamente lo aumenté a 150 y ya no recibí el error.

Ejemplo del error

Este es un ejemplo de código que genera este error cuando el nivel de compatibilidad de la base de datos es inferior 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)
    );

Resultado:

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.

Corregir el error

Puede corregir fácilmente este error cambiando el nivel de compatibilidad de la base de datos a 130 o superior.

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

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

Resultado:

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

Alternativamente, si no desea cambiar esto, puede cambiar a una base de datos que sepa que tiene un nivel de compatibilidad adecuado.

Esperemos que esta publicación ayude a alguien que encuentre el mismo error.