sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan rettes "Ugyldigt objektnavn 'OPENJSON'." i SQL Server

Hvis du støder på fejlmeddelelse 208, niveau 16 "Ugyldigt objektnavn 'OPENJSON'.", forsøger du sandsynligvis at bruge OPENJSON() funktion på en database med et kompatibilitetsniveau på mindre end 130.

OPENJSON() er kun tilgængelig under kompatibilitetsniveau 130 eller højere.

For at løse dette skal du enten øge kompatibilitetsniveauet for din database til 130 eller højere, eller skifte til en database, der allerede har det passende kompatibilitetsniveau.

Eksempel på fejl

Her er et eksempel på en grundlæggende kode, der vil forårsage denne fejl.

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

Resultat:

Besked 208, niveau 16, tilstand 1, linje 1 Ugyldigt objektnavn 'OPENJSON'.

Når dit databasekompatibilitetsniveau er lavere end 130, kan SQL Server ikke finde og køre OPENJSON() funktion.

I mit tilfælde havde databasen, jeg prøvede at køre dette på, et kompatibilitetsniveau på 120.

Tjek kompatibilitetsniveauet for databasen

Du kan forespørge sys.databases for at kontrollere kompatibilitetsniveauet for databasen (eller alle databaser, hvis du foretrækker det).

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

Resultat:

+------------------------------+| kompatibilitetsniveau   ||-----------------------------|| 120                   |+----------------------------+

Som mistænkt har denne database et kompatibilitetsniveau på mindre end 130.

Løsning 1

Den mest oplagte løsning er at øge kompatibilitetsniveauet for den database, som du forsøger at køre OPENJSON() for imod.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150; 

Kørsel af denne kode øges databasens kompatibilitetsniveau til 150, hvilket er mere end højt nok til at understøtte OPENJSON() funktion.

Hvis vi tjekker kompatibilitetsniveauet igen, kan vi se, at det er øget til 150.

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

Resultat:

+------------------------------+| kompatibilitetsniveau   ||-----------------------------|| 150                   |+----------------------------+

Nu kan vi køre den originale kode uden fejl.

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

Resultat:

+-------+---------+--------+| nøgle   | værdi   | skriv   ||------+---------+--------|| 0     | Kat     | 1      || 1     | Hund     | 1      || 2     | Fugl    | 1      |+-------+---------+--------+

Løsning 2

Hvis du af en eller anden grund ikke kan eller ikke ønsker at ændre kompatibilitetsniveauet for databasen, kan du skifte til en database, der allerede har det passende kompatibilitetsniveau.

Det er klart, at dette kan være passende eller ikke, afhængigt af om du skal indsætte din parsede JSON i databasen eller ej.

For at gøre dette kan du forespørge sys.databases for en passende database.

SELECT 
    name,
    compatibility_level
FROM sys.databases; 

Resultat:

+--------------------+-----------------------------+| navn               | kompatibilitetsniveau   ||------------------------+----------------------------|| mester             | 150                   || tempdb             | 150                   || model              | 150                   || msdb               | 150                   || Musik              | 150                   || Test               | 150                   || WideWorldImporters | 130                   || Verden              | 140                   || Kæledyr               | 120                   |+-------------------+-----------------------------+ 

Heldigvis i dette tilfælde er alle andre databaser 130 eller højere. Så vi kunne skifte til en af ​​dem.

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

Resultat:

+-------+---------+--------+| nøgle   | værdi   | skriv   ||-------+---------+--------|| 0     | Kat     | 1      || 1     | Hund     | 1      || 2     | Fugl    | 1      |+-------+---------+--------+


  1. er der en group_concat funktion i ms-access?

  2. Microsoft Access er IKKE død, og det er VBA heller ikke

  3. Forskellen mellem #temptable og ##Temptable?

  4. SQL LIKE Operator for begyndere