Ако срещнете грешка 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 |+-------+--------+-------+