sql >> Databáze >  >> RDS >> Sqlserver

Jak opravit „Neplatný název objektu ‚OPENJSON‘.“ v SQL Server

Pokud narazíte na chybovou zprávu 208, úroveň 16 „Neplatný název objektu ‚OPENJSON‘.“, pravděpodobně se pokoušíte použít OPENJSON() fungovat na databázi s úrovní kompatibility nižší než 130.

OPENJSON() je k dispozici pouze pod úrovní kompatibility 130 nebo vyšší.

Chcete-li tento problém vyřešit, buď zvyšte úroveň kompatibility své databáze na 130 nebo vyšší, nebo přejděte na databázi, která již příslušnou úroveň kompatibility má.

Příklad chyby

Zde je příklad základního kódu, který tuto chybu způsobí.

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

Výsledek:

Zpráva 208, úroveň 16, stav 1, řádek 1 Neplatný název objektu 'OPENJSON'.

Když je úroveň kompatibility vaší databáze nižší než 130, SQL Server nemůže najít a spustit OPENJSON() funkce.

V mém případě měla databáze, na které jsem se to snažil spustit, úroveň kompatibility 120.

Zkontrolujte úroveň kompatibility databáze

Můžete se dotazovat na sys.databases pro kontrolu úrovně kompatibility databáze (nebo všech databází, chcete-li).

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

Výsledek:

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

Podle podezření má tato databáze úroveň kompatibility nižší než 130.

Řešení 1

Nejviditelnějším řešením je zvýšit úroveň kompatibility databáze, pro kterou se pokoušíte spustit OPENJSON() proti.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150; 

Spuštění tohoto kódu zvýší úroveň kompatibility databáze na 150, což je více než dostatečně vysoká hodnota pro podporu OPENJSON() funkce.

Pokud znovu zkontrolujeme úroveň kompatibility, uvidíme, že se zvýšila na 150.

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

Výsledek:

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

Nyní můžeme spustit původní kód bez chyby.

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

Výsledek:

+-------+---------+--------+| klíč   | hodnota   | typ   ||-------+---------+--------|| 0     | Kočka     | 1      || 1     | Pes     | 1      || 2     | Pták    | 1      |+-------+---------+--------+

Řešení 2

Pokud z nějakého důvodu nemůžete nebo nechcete změnit úroveň kompatibility databáze, můžete přejít na databázi, která již příslušnou úroveň kompatibility má.

Je zřejmé, že to může nebo nemusí být vhodné, v závislosti na tom, zda potřebujete vložit analyzovaný JSON do databáze nebo ne.

Každopádně, abyste to udělali, můžete zadat dotaz na sys.databases pro vhodnou databázi.

SELECT 
    name,
    compatibility_level
FROM sys.databases; 

Výsledek:

+--------------------+-----------------------+| jméno               | compatibility_level   ||--------------------+-----------------------|| mistr             | 150                   || tempdb             | 150                   || model              | 150                   || msdb               | 150                   || Hudba              | 150                   || Test               | 150                   || WideWorldImporters | 130                   || Svět              | 140                   || Domácí mazlíčci               | 120                   |+--------------------+-----------------------+ 

Naštěstí v tomto případě jsou všechny ostatní databáze 130 nebo vyšší. Takže bychom mohli přejít na kteroukoli z nich.

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

Výsledek:

+-------+---------+--------+| klíč   | hodnota   | typ   ||-------+---------+--------|| 0     | Kočka     | 1      || 1     | Pes     | 1      || 2     | Pták    | 1      |+-------+---------+--------+


  1. Co je schéma databáze?

  2. T-SQL dotaz pro zobrazení definice tabulky?

  3. Vytvořte web s MySQL

  4. Vraťte řádky, které obsahují alfanumerické znaky v SQLite