Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como corrigir "Nome de objeto inválido 'OPENJSON'." no SQL Server


Se você encontrar o erro Msg 208, Level 16 “Invalid object name ‘OPENJSON’.”, você provavelmente está tentando usar o OPENJSON() funcionam em um banco de dados com um nível de compatibilidade inferior a 130.

OPENJSON() está disponível apenas no nível de compatibilidade 130 ou superior.

Para corrigir isso, aumente o nível de compatibilidade do banco de dados para 130 ou superior ou altere para um banco de dados que já tenha o nível de compatibilidade apropriado.

Exemplo de erro


Aqui está um exemplo de algum código básico que causará esse erro.
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]'); 

Resultado:
Mensagem 208, Nível 16, Estado 1, Linha 1 Nome de objeto inválido 'OPENJSON'.

Quando o nível de compatibilidade do banco de dados é inferior a 130, o SQL Server não consegue encontrar e executar o OPENJSON() função.

No meu caso, o banco de dados em que eu estava tentando executar isso tinha um nível de compatibilidade de 120.

Verifique o nível de compatibilidade do banco de dados


Você pode consultar sys.databases para verificar o nível de compatibilidade do banco de dados (ou todos os bancos de dados, se preferir).
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets'; 

Resultado:
+-----------------------+| compatibilidade_nível   ||-----------------------|| 120                   |+-----------------------+

Como suspeito, este banco de dados tem um nível de compatibilidade inferior a 130.

Solução 1


A solução mais óbvia é aumentar o nível de compatibilidade do banco de dados para o qual você está tentando executar OPENJSON() contra.
ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150; 

A execução desse código aumentará o nível de compatibilidade do banco de dados para 150, que é mais do que alto o suficiente para suportar o OPENJSON() função.

Se verificarmos o nível de compatibilidade novamente, podemos ver que ele aumentou para 150.
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets'; 

Resultado:
+-----------------------+| compatibilidade_nível   ||-----------------------|| 150                   |+-----------------------+

Agora podemos executar o código original sem erros.
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]'); 

Resultado:
+-------+---------+-----------+| chave   | valor   | digite   ||-------+---------+--------|| 0     | Gato     | 1      || 1     | Cão     | 1      || 2     | Pássaro    | 1      |+-------+---------+--------+

Solução 2


Se por algum motivo você não puder ou não quiser alterar o nível de compatibilidade do banco de dados, poderá alternar para um banco de dados que já tenha o nível de compatibilidade apropriado.

Obviamente, isso pode ou não ser adequado, dependendo se você precisa inserir seu JSON analisado no banco de dados ou não.

De qualquer forma, para fazer isso, você pode consultar sys.databases para um banco de dados adequado.
SELECT 
    name,
    compatibility_level
FROM sys.databases; 

Resultado:
+--------------------+-----------------------+| nome               | compatibilidade_level   ||--------------------+-----------------------|| mestre             | 150                   || tempdb             | 150                   || modelo              | 150                   || msdb               | 150                   || Música              | 150                   || Teste               | 150                   || WideWorldImporters | 130                   || Mundo              | 140                   || Animais de estimação               | 120                   |+--------------------+-----------------------+ 
Felizmente, neste caso, todos os outros bancos de dados são 130 ou superiores. Assim, poderíamos mudar para qualquer um deles.
USE World;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]'); 

Resultado:
+-------+---------+-----------+| chave   | valor   | digite   ||-------+---------+--------|| 0     | Gato     | 1      || 1     | Cão     | 1      || 2     | Pássaro    | 1      |+-------+---------+--------+