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

Come risolvere "Nome oggetto non valido 'OPENJSON'". in SQL Server

Se riscontri l'errore Msg 208, livello 16 "Nome oggetto non valido 'OPENJSON'.", probabilmente stai tentando di utilizzare OPENJSON() funzione su un database con un livello di compatibilità inferiore a 130.

OPENJSON() è disponibile solo con il livello di compatibilità 130 o superiore.

Per risolvere il problema, aumenta il livello di compatibilità del database a 130 o superiore oppure passa a un database che dispone già del livello di compatibilità appropriato.

Esempio di errore

Ecco un esempio di codice di base che causerà questo errore.

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

Risultato:

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

Quando il livello di compatibilità del database è inferiore a 130, SQL Server non riesce a trovare ed eseguire OPENJSON() funzione.

Nel mio caso, il database su cui stavo cercando di eseguire questo aveva un livello di compatibilità di 120.

Verifica il livello di compatibilità del database

Puoi interrogare sys.databases per verificare il livello di compatibilità del database (o di tutti i database se preferisci).

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

Risultato:

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

Come sospettato, questo database ha un livello di compatibilità inferiore a 130.

Soluzione 1

La soluzione più ovvia è aumentare il livello di compatibilità del database per il quale stai tentando di eseguire OPENJSON() contro.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150;

L'esecuzione di quel codice aumenterà il livello di compatibilità del database a 150, che è più che sufficiente per supportare OPENJSON() funzione.

Se controlliamo di nuovo il livello di compatibilità, possiamo vedere che è aumentato a 150.

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

Risultato:

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

Ora possiamo eseguire il codice originale senza errori.

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

Risultato:

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

Soluzione 2

Se per qualche motivo non puoi o non vuoi modificare il livello di compatibilità del database, puoi passare a un database che ha già il livello di compatibilità appropriato.

Ovviamente, questo può essere adatto o meno, a seconda che tu debba inserire o meno il tuo JSON analizzato nel database.

Ad ogni modo, per fare ciò, puoi interrogare sys.databases per un database adatto.

SELECT 
    name,
    compatibility_level
FROM sys.databases;

Risultato:

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

Fortunatamente in questo caso, tutti gli altri database sono 130 o superiori. Quindi potremmo passare a uno qualsiasi di loro.

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

Risultato:

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