Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

OPENJSON „Nieprawidłowa składnia w pobliżu słowa kluczowego „z”.”. w SQL Server (ROZWIĄZANE)

Jeśli próbujesz uruchomić OPENJSON() w programie SQL Server, ale otrzymujesz komunikat o błędzie 319, poziom 15 „Niepoprawna składnia w pobliżu słowa kluczowego „z””, jedną z możliwości jest to, że naprawdę wystąpił błąd składni.

Ale jeśli sprawdziłeś i dwukrotnie sprawdziłeś, i jesteś przekonany, że nie ma błędu składni, może to oznaczać, że błąd jest efektem ubocznym niewłaściwego poziomu zgodności bazy danych.

Normalnie otrzymasz komunikat o błędzie 208, poziom 16 „Nieprawidłowa nazwa obiektu „OPENJSON”. podczas korzystania z poziomu zgodności bazy danych niższego niż 130, ale w niektórych przypadkach SQL Server znajduje problem z WITH najpierw klauzula.

Napotkałem ten błąd podczas uruchamiania prawidłowego OPENJSON() kodu, ale w bazie danych, w której poziom zgodności wynosił tylko 120.

OPENJSON() jest dostępny tylko w bazach danych o poziomie zgodności 130 lub wyższym.

Kiedy sprawdziłem poziom zgodności mojej bazy danych, zobaczyłem, że wynosi 120. Od razu zwiększyłem go do 150 i już nie otrzymuję błędu.

Przykład błędu

Oto przykład kodu, który powoduje ten błąd, gdy poziom zgodności bazy danych jest niższy niż 130.

DECLARE @json NVARCHAR(4000) = N'{ 
    "pets" : {
            "cats" : [
            { "id" : 1, "name" : "Fluffy", "sex" : "Female" },
            { "id" : 2, "name" : "Long Tail", "sex" : "Female" },
            { "id" : 3, "name" : "Scratch", "sex" : "Male" }
        ],
            "dogs" : [
            { "id" : 1, "name" : "Fetch", "sex" : "Male" },
            { "id" : 2, "name" : "Fluffy", "sex" : "Male" },
            { "id" : 3, "name" : "Wag", "sex" : "Female" }
        ]
    }
}'

SELECT *
FROM OPENJSON(@json, '$.pets.dogs')
WITH  (
        [id]    int,  
        [name]  varchar(60), 
        [sex]   varchar(6)
    );

Wynik:

Msg 319, Level 15, State 2, Line 17
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

Napraw błąd

Możesz łatwo naprawić ten błąd, zmieniając poziom zgodności bazy danych na 130 lub wyższy.

-- Change compatibility level
ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150;

-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';

Wynik:

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

Alternatywnie, jeśli nie chcesz tego zmieniać, możesz przełączyć się na bazę danych, o której wiesz, że ma odpowiedni poziom zgodności.

Mam nadzieję, że ten post pomoże komuś, kto napotka ten sam błąd.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL Server w celu znalezienia wszystkich uprawnień/dostępu dla wszystkich użytkowników w bazie danych

  2. Wstawianie danych SQL Server do Salesforce.com

  3. Aktualizuj statystyki SQL Server za pomocą planu konserwacji bazy danych

  4. Różnica między CTE a SubQuery?

  5. Jak znaleźć sortowanie bazy danych obsługiwane przez instancję SQL Server?