Jeśli napotkasz błąd Msg 208, poziom 16 „Nieprawidłowa nazwa obiektu ‚OPENJSON’.”, prawdopodobnie próbujesz użyć OPENJSON()
działać w bazie danych o poziomie zgodności mniejszym niż 130.
OPENJSON()
jest dostępny tylko na poziomie zgodności 130 lub wyższym.
Aby to naprawić, zwiększ poziom zgodności swojej bazy danych do 130 lub wyższego lub zmień bazę danych, która ma już odpowiedni poziom zgodności.
Przykład błędu
Oto przykład podstawowego kodu, który spowoduje ten błąd.
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
Wynik:
Msg 208, Level 16, State 1, Line 1 Invalid object name 'OPENJSON'.
Gdy poziom zgodności Twojej bazy danych jest niższy niż 130, SQL Server nie może znaleźć i uruchomić OPENJSON()
funkcja.
W moim przypadku baza danych, na której próbowałem to uruchomić, miała poziom zgodności 120.
Sprawdź poziom zgodności bazy danych
Możesz zapytać sys.databases
aby sprawdzić poziom zgodności bazy danych (lub wszystkich baz danych, jeśli wolisz).
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Wynik:
+-----------------------+ | compatibility_level | |-----------------------| | 120 | +-----------------------+
Zgodnie z podejrzeniami ta baza danych ma poziom zgodności poniżej 130.
Rozwiązanie 1
Najbardziej oczywistym rozwiązaniem jest zwiększenie poziomu zgodności bazy danych, dla której próbujesz uruchomić OPENJSON()
przeciw.
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
Uruchomienie tego kodu zwiększy poziom zgodności bazy danych do 150, co jest więcej niż wystarczające do obsługi OPENJSON()
funkcja.
Jeśli ponownie sprawdzimy poziom zgodności, zobaczymy, że wzrósł do 150.
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Wynik:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Teraz możemy uruchomić oryginalny kod bez błędów.
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
Wynik:
+-------+---------+--------+ | key | value | type | |-------+---------+--------| | 0 | Cat | 1 | | 1 | Dog | 1 | | 2 | Bird | 1 | +-------+---------+--------+
Rozwiązanie 2
Jeśli z jakiegoś powodu nie możesz lub nie chcesz zmienić poziomu zgodności bazy danych, możesz przełączyć się na bazę danych, która ma już odpowiedni poziom zgodności.
Oczywiście może to być odpowiednie lub nie, w zależności od tego, czy musisz wstawić przeanalizowany JSON do bazy danych, czy nie.
W każdym razie, aby to zrobić, możesz zapytać sys.databases
dla odpowiedniej bazy danych.
SELECT
name,
compatibility_level
FROM sys.databases;
Wynik:
+--------------------+-----------------------+ | name | compatibility_level | |--------------------+-----------------------| | master | 150 | | tempdb | 150 | | model | 150 | | msdb | 150 | | Music | 150 | | Test | 150 | | WideWorldImporters | 130 | | World | 140 | | Pets | 120 | +--------------------+-----------------------+
Na szczęście w tym przypadku wszystkie inne bazy danych mają 130 lub więcej. Abyśmy mogli przełączyć się na dowolny z nich.
USE World;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
Wynik:
+-------+---------+--------+ | key | value | type | |-------+---------+--------| | 0 | Cat | 1 | | 1 | Dog | 1 | | 2 | Bird | 1 | +-------+---------+--------+