sql >> Database >  >> RDS >> Sqlserver

Hoe te repareren "Ongeldige objectnaam 'OPENJSON'." in SQL Server

Als u foutbericht 208, niveau 16 "Ongeldige objectnaam 'OPENJSON'." tegenkomt, probeert u waarschijnlijk de OPENJSON() te gebruiken functioneren op een database met een compatibiliteitsniveau van minder dan 130.

OPENJSON() is alleen beschikbaar onder compatibiliteitsniveau 130 of hoger.

Om dit op te lossen, verhoogt u het compatibiliteitsniveau van uw database naar 130 of hoger, of wijzigt u naar een database die al het juiste compatibiliteitsniveau heeft.

Voorbeeld van fout

Hier is een voorbeeld van een basiscode die deze fout veroorzaakt.

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

Resultaat:

Msg 208, Level 16, State 1, Line 1
Invalid object name 'OPENJSON'.

Als uw databasecompatibiliteitsniveau lager is dan 130, kan SQL Server de OPENJSON() niet vinden en uitvoeren functie.

In mijn geval had de database waarop ik dit probeerde uit te voeren een compatibiliteitsniveau van 120.

Controleer het compatibiliteitsniveau van de database

U kunt sys.databases . opvragen om het compatibiliteitsniveau van de database te controleren (of alle databases als u dat liever heeft).

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

Resultaat:

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

Zoals vermoed heeft deze database een compatibiliteitsniveau van minder dan 130.

Oplossing 1

De meest voor de hand liggende oplossing is om het compatibiliteitsniveau te verhogen van de database waarvoor u OPENJSON() probeert uit te voeren. tegen.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150;

Als u die code uitvoert, wordt het compatibiliteitsniveau van de database verhoogd tot 150, wat meer dan hoog genoeg is om de OPENJSON() te ondersteunen functie.

Als we het compatibiliteitsniveau opnieuw controleren, kunnen we zien dat het is verhoogd tot 150.

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

Resultaat:

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

Nu kunnen we de originele code zonder fouten uitvoeren.

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

Resultaat:

+-------+---------+--------+
| key   | value   | type   |
|-------+---------+--------|
| 0     | Cat     | 1      |
| 1     | Dog     | 1      |
| 2     | Bird    | 1      |
+-------+---------+--------+

Oplossing 2

Als u om de een of andere reden het compatibiliteitsniveau van de database niet kunt of wilt wijzigen, kunt u overschakelen naar een database die al het juiste compatibiliteitsniveau heeft.

Het is duidelijk dat dit al dan niet geschikt kan zijn, afhankelijk van of u uw geparseerde JSON in de database moet invoegen of niet.

Hoe dan ook, om dit te doen, zou je sys.databases . kunnen opvragen voor een geschikte database.

SELECT 
    name,
    compatibility_level
FROM sys.databases;

Resultaat:

+--------------------+-----------------------+
| name               | compatibility_level   |
|--------------------+-----------------------|
| master             | 150                   |
| tempdb             | 150                   |
| model              | 150                   |
| msdb               | 150                   |
| Music              | 150                   |
| Test               | 150                   |
| WideWorldImporters | 130                   |
| World              | 140                   |
| Pets               | 120                   |
+--------------------+-----------------------+

Gelukkig zijn in dit geval alle andere databases 130 of hoger. Dus we kunnen overschakelen naar een van hen.

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

Resultaat:

+-------+---------+--------+
| key   | value   | type   |
|-------+---------+--------|
| 0     | Cat     | 1      |
| 1     | Dog     | 1      |
| 2     | Bird    | 1      |
+-------+---------+--------+


  1. Hoe de serversortering in MySQL te tonen

  2. Selecteer gegevens tussen een datum/tijdbereik

  3. Entiteitsframework erg traag om voor de eerste keer te laden na elke compilatie

  4. Hoe voer ik PHP uit dat is opgeslagen in een MySQL-database?