Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да коригирате „Невалидно име на обект „OPENJSON“.“ в SQL Server

Ако срещнете грешка Msg 208, ниво 16 „Невалидно име на обект „OPENJSON“.“, вероятно се опитвате да използвате OPENJSON() функция на база данни с ниво на съвместимост по-малко от 130.

OPENJSON() е наличен само при ниво на съвместимост 130 или по-високо.

За да коригирате това, или увеличете нивото на съвместимост на вашата база данни до 130 или по-високо, или променете към база данни, която вече има подходящото ниво на съвместимост.

Пример за грешка

Ето пример за основен код, който ще причини тази грешка.

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

Резултат:

Съобщение 208, ниво 16, състояние 1, ред 1 Невалидно име на обект „OPENJSON“.

Когато нивото на съвместимост на вашата база данни е по-ниско от 130, SQL Server не може да намери и изпълни OPENJSON() функция.

В моя случай базата данни, в която се опитвах да стартирам това, имаше ниво на съвместимост 120.

Проверете нивото на съвместимост на базата данни

Можете да направите заявка за sys.databases за да проверите нивото на съвместимост на базата данни (или всички бази данни, ако предпочитате).

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

Резултат:

<пред>+-----------------------+| ниво на съвместимост   ||-----------------------|| 120                   |+-----------------------+

Както се подозира, тази база данни има ниво на съвместимост по-малко от 130.

Решение 1

Най-очевидното решение е да увеличите нивото на съвместимост на базата данни, за която се опитвате да стартирате OPENJSON() против.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150; 

Изпълнението на този код ще увеличи нивото на съвместимост на базата данни до 150, което е повече от достатъчно високо, за да поддържа OPENJSON() функция.

Ако проверим отново нивото на съвместимост, можем да видим, че е увеличено до 150.

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

Резултат:

<пред>+-----------------------+| ниво на съвместимост   ||-----------------------|| 150                   |+-----------------------+

Сега можем да изпълним оригиналния код без грешка.

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

Резултат:

<пред>+-------+--------+-------+| ключ   | стойност   | тип   ||-------+--------+-------|| 0     | Котка     | 1      || 1     | Куче     | 1      || 2     | Птица    | 1      |+-------+--------+-------+

Решение 2

Ако по някаква причина не можете или не искате да промените нивото на съвместимост на базата данни, можете да преминете към база данни, която вече има подходящото ниво на съвместимост.

Очевидно това може да е подходящо или не, в зависимост от това дали трябва да вмъкнете анализирания JSON в базата данни или не.

Както и да е, за да направите това, можете да направите заявка за sys.databases за подходяща база данни.

SELECT 
    name,
    compatibility_level
FROM sys.databases; 

Резултат:

+--------------------+-----------------------+| име               | ниво_на съвместимост   ||-------------------+-----------------------|| майстор             | 150                   || tempdb             | 150                   || модел              | 150                   || msdb               | 150                   || Музика              | 150                   || Тест               | 150                   || WideWorldImporters | 130                   || Свят              | 140                   || Домашни любимци               | 120                   |+-------------------+-----------------------+ 

За щастие в този случай всички други бази данни са 130 или по-високи. Така че можем да преминем към всеки един от тях.

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

Резултат:

<пред>+-------+--------+-------+| ключ   | стойност   | тип   ||-------+--------+-------|| 0     | Котка     | 1      || 1     | Куче     | 1      || 2     | Птица    | 1      |+-------+--------+-------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2016:Запазване на резултатите от заявката в CSV файл

  2. Как да запазите един екземпляр на връзка на SQL Server отворен за множество заявки в C#?

  3. Архивиране на SQL Server 2017 -2

  4. Възможно ли е принудително заключване на ниво ред в SQL Server?

  5. Промяна на график на агент на SQL Server (T-SQL)