Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

OPENJSON „Неправилен синтаксис близо до ключовата дума „с“.“ в SQL Server (РЕШЕНО)

Ако се опитвате да стартирате някакъв OPENJSON() код в SQL Server, но получавате съобщение за грешка 319, ниво 15 „Неправилен синтаксис близо до ключовата дума „с““, една от възможностите е наистина да имате синтактична грешка.

Но ако сте проверили и проверили два пъти и сте убедени, че няма синтактична грешка, всъщност може да се окаже, че грешката е страничен ефект от наличието на грешно ниво на съвместимост на базата данни.

Обикновено ще получите съобщение за грешка 208, ниво 16 „Невалидно име на обект „OPENJSON“.“ когато се използва ниво на съвместимост на база данни по-ниско от 130, но в някои случаи SQL Server открива проблем с WITH клауза първа.

Срещнах тази грешка при изпълнение на валиден OPENJSON() код, но в база данни, където нивото на съвместимост е само 120.

OPENJSON() е наличен само в бази данни с ниво на съвместимост от 130 или по-високо.

Когато проверих нивото на съвместимост на базата си данни, видях, че е 120. Веднага го увеличих на 150 и вече не получавах грешката.

Пример за грешката

Ето пример за код, който произвежда тази грешка, когато нивото на съвместимост на базата данни е по-ниско от 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)
    ); 

Резултат:

Съобщение 319, ниво 15, състояние 2, ред 17 Неправилен синтаксис близо до ключовата дума „с“. Ако този израз е общ табличен израз, клауза xmlnamespaces или контекстна клауза за проследяване на промяна, предишният израз трябва да бъде завършен с точка и запетая.

Поправете грешката

Можете лесно да поправите тази грешка, като промените нивото на съвместимост на базата данни на 130 или по-високо.

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

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

Резултат:

<пред>+-----------------------+| ниво_на съвместимост ||-----------------------|| 150 |+-----------------------+

Като алтернатива, ако не искате да променяте това, можете да преминете към база данни, за която знаете, че има подходящо ниво на съвместимост.

Надяваме се тази публикация да помогне на някой там, който срещне същата грешка.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция за разделяне в SQL Server 2008

  2. Генерирайте диаграма на връзката на таблицата от съществуваща схема (SQL Server)

  3. SQL Server Fuzzy Search с процент на съвпадение

  4. T-SQL:Избор на колона въз основа на MAX (друга колона)

  5. Получаване на динамично генерирана обобщена таблица във времева таблица