sql >> Databáze >  >> RDS >> Sqlserver

OPENJSON „Nesprávná syntaxe poblíž klíčového slova ‚s‘.“ v SQL Server (VYŘEŠENO)

Pokud se pokoušíte spustit nějaký OPENJSON() kód na SQL Server, ale dostáváte chybovou zprávu Msg 319, Level 15 „Nesprávná syntaxe poblíž klíčového slova ‚s‘“, jednou z možností je, že skutečně máte chybu syntaxe.

Ale pokud jste zkontrolovali a dvakrát zkontrolovali a jste přesvědčeni, že nedošlo k žádné syntaktické chybě, může to být ve skutečnosti tak, že chyba je vedlejším efektem nesprávné úrovně kompatibility databáze.

Normálně se zobrazí chybová zpráva 208, úroveň 16 „Neplatný název objektu ‚OPENJSON‘. při použití úrovně kompatibility databáze nižší než 130, ale v některých případech SQL Server zjistí problém s WITH klauzule první.

Na tuto chybu jsem narazil při spuštění platného OPENJSON() kód, ale na databázi, kde byla úroveň kompatibility pouze 120.

OPENJSON() je k dispozici pouze u databází s úrovní kompatibility 130 nebo vyšší.

Když jsem zkontroloval svou úroveň kompatibility databáze, viděl jsem, že je to 120. Okamžitě jsem ji zvýšil na 150 a už se mi nezobrazuje chyba.

Příklad chyby

Zde je příklad kódu, který způsobí tuto chybu, když je úroveň kompatibility databáze nižší než 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)
    );

Výsledek:

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.

Opravit chybu

Tuto chybu můžete snadno opravit změnou úrovně kompatibility databáze na 130 nebo vyšší.

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

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

Výsledek:

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

Případně, pokud to nechcete měnit, můžete přejít na databázi, o které víte, že má vhodnou úroveň kompatibility.

Doufejme, že tento příspěvek pomůže někomu, kdo narazí na stejnou chybu.


  1. Jak vložím více hodnot zaškrtávacích políček do tabulky?

  2. SQL Server 2016:sys.dm_exec_function_stats

  3. Co dělá transakce kolem jednoho výpisu?

  4. Jak získat velikost databáze mysql?