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

Cómo arreglar "Nombre de objeto no válido 'OPENJSON'". en servidor SQL

Si encuentra el mensaje de error 208, nivel 16 "Nombre de objeto no válido 'OPENJSON'", probablemente esté intentando usar OPENJSON() funcionar en una base de datos con un nivel de compatibilidad inferior a 130.

OPENJSON() solo está disponible con el nivel de compatibilidad 130 o superior.

Para solucionar esto, aumente el nivel de compatibilidad de su base de datos a 130 o más, o cambie a una base de datos que ya tenga el nivel de compatibilidad adecuado.

Ejemplo de error

Aquí hay un ejemplo de un código básico que causará este error.

USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');

Resultado:

Msg 208, Level 16, State 1, Line 1
Invalid object name 'OPENJSON'.

Cuando el nivel de compatibilidad de su base de datos es inferior a 130, SQL Server no puede encontrar ni ejecutar OPENJSON() función.

En mi caso, la base de datos en la que intentaba ejecutar esto tenía un nivel de compatibilidad de 120.

Comprobar el nivel de compatibilidad de la base de datos

Puede consultar sys.databases para verificar el nivel de compatibilidad de la base de datos (o de todas las bases de datos si lo prefiere).

SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';

Resultado:

+-----------------------+
| compatibility_level   |
|-----------------------|
| 120                   |
+-----------------------+

Como se sospechaba, esta base de datos tiene un nivel de compatibilidad inferior a 130.

Solución 1

La solución más obvia es aumentar el nivel de compatibilidad de la base de datos para la que está intentando ejecutar OPENJSON() contra.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150;

Ejecutar ese código aumentará el nivel de compatibilidad de la base de datos a 150, que es lo suficientemente alto como para admitir OPENJSON() función.

Si volvemos a comprobar el nivel de compatibilidad, podemos ver que ha aumentado a 150.

SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';

Resultado:

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

Ahora podemos ejecutar el código original sin errores.

USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');

Resultado:

+-------+---------+--------+
| key   | value   | type   |
|-------+---------+--------|
| 0     | Cat     | 1      |
| 1     | Dog     | 1      |
| 2     | Bird    | 1      |
+-------+---------+--------+

Solución 2

Si por algún motivo no puede o no quiere cambiar el nivel de compatibilidad de la base de datos, puede cambiar a una base de datos que ya tenga el nivel de compatibilidad adecuado.

Obviamente, esto puede o no ser adecuado, dependiendo de si necesita insertar su JSON analizado en la base de datos o no.

De todos modos, para hacer esto, puede consultar sys.databases para una base de datos adecuada.

SELECT 
    name,
    compatibility_level
FROM sys.databases;

Resultado:

+--------------------+-----------------------+
| name               | compatibility_level   |
|--------------------+-----------------------|
| master             | 150                   |
| tempdb             | 150                   |
| model              | 150                   |
| msdb               | 150                   |
| Music              | 150                   |
| Test               | 150                   |
| WideWorldImporters | 130                   |
| World              | 140                   |
| Pets               | 120                   |
+--------------------+-----------------------+

Afortunadamente, en este caso, todas las demás bases de datos son 130 o superiores. Entonces podríamos cambiar a cualquiera de ellos.

USE World;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');

Resultado:

+-------+---------+--------+
| key   | value   | type   |
|-------+---------+--------|
| 0     | Cat     | 1      |
| 1     | Dog     | 1      |
| 2     | Bird    | 1      |
+-------+---------+--------+