sql >> Databasteknik >  >> RDS >> Sqlserver

Så här fixar du "Ogiltigt objektnamn 'OPENJSON'." i SQL Server

Om du stöter på felmeddelande 208, nivå 16 "Ogiltigt objektnamn 'OPENJSON'.", försöker du förmodligen använda OPENJSON() funktion på en databas med en kompatibilitetsnivå på mindre än 130.

OPENJSON() är endast tillgänglig under kompatibilitetsnivå 130 eller högre.

För att åtgärda detta, höj antingen kompatibilitetsnivån för din databas till 130 eller högre, eller byt till en databas som redan har lämplig kompatibilitetsnivå.

Exempel på fel

Här är ett exempel på en grundläggande kod som orsakar det här felet.

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

Resultat:

Msg 208, Level 16, State 1, Rad 1Ogiltigt objektnamn 'OPENJSON'.

När din databaskompatibilitetsnivå är lägre än 130 kan SQL Server inte hitta och köra OPENJSON() funktion.

I mitt fall hade databasen jag försökte köra detta på en kompatibilitetsnivå på 120.

Kontrollera kompatibilitetsnivån för databasen

Du kan fråga sys.databases för att kontrollera kompatibilitetsnivån för databasen (eller alla databaser om du föredrar det).

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

Resultat:

+------------------------------+| kompatibilitetsnivå   ||-----------------------------|| 120                   |+----------------------------+

Som misstänkt har denna databas en kompatibilitetsnivå på mindre än 130.

Lösning 1

Den mest uppenbara lösningen är att öka kompatibilitetsnivån för databasen som du försöker köra OPENJSON() för mot.

ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150; 

Att köra den koden kommer att öka databasens kompatibilitetsnivå till 150, vilket är mer än tillräckligt högt för att stödja OPENJSON() funktion.

Om vi ​​kontrollerar kompatibilitetsnivån igen kan vi se att den har ökat till 150.

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

Resultat:

+------------------------------+| kompatibilitetsnivå   ||-----------------------------|| 150                   |+----------------------------+

Nu kan vi köra den ursprungliga koden utan fel.

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

Resultat:

+-------+---------+--------+| nyckel   | värde   | skriv   ||-------+---------+--------|| 0     | Katt     | 1      || 1     | Hund     | 1      || 2     | Fågel    | 1      |+-------+---------+--------+

Lösning 2

Om du av någon anledning inte kan, eller inte vill, ändra kompatibilitetsnivån för databasen, kan du byta till en databas som redan har lämplig kompatibilitetsnivå.

Uppenbarligen kan detta vara lämpligt eller inte, beroende på om du behöver infoga din tolkade JSON i databasen eller inte.

Hur som helst, för att göra detta kan du fråga sys.databases för en lämplig databas.

SELECT 
    name,
    compatibility_level
FROM sys.databases; 

Resultat:

+--------------------+-----------------------------+| namn               | kompatibilitetsnivå   ||------------------------+-----------------------------|| mästare             | 150                   || tempdb             | 150                   || modell              | 150                   || msdb               | 150                   || Musik              | 150                   || Testa               | 150                   || WideWorldImporters | 130                   || Världen              | 140                   || Husdjur               | 120                   |+-------------------+-----------------------------+ 

Lyckligtvis i det här fallet är alla andra databaser 130 eller högre. Så vi kunde byta till vilken som helst av dem.

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

Resultat:

+-------+---------+--------+| nyckel   | värde   | skriv   ||-------+---------+--------|| 0     | Katt     | 1      || 1     | Hund     | 1      || 2     | Fågel    | 1      |+-------+---------+--------+


  1. Hur Atand() fungerar i PostgreSQL

  2. RDLC LocalReport Export till Excel riktigt långsam

  3. Hur man lagrar JSON-data i MySQL

  4. Oracle-partition efter nyckelord