Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

OPENJSON "Sintaxe incorreta perto da palavra-chave 'com'." no SQL Server (RESOLVIDO)


Se você está tentando executar algum OPENJSON() código no SQL Server, mas você está recebendo erro Msg 319, Nível 15 “Sintaxe incorreta perto da palavra-chave 'com'”, uma possibilidade é que você realmente tenha um erro de sintaxe.

Mas se você verificou e verificou duas vezes, e está convencido de que não há erro de sintaxe, pode ser que o erro seja um efeito colateral de ter o nível de compatibilidade de banco de dados errado.

Normalmente, você receberia o erro Msg 208, Level 16 "Nome de objeto inválido 'OPENJSON'." ao usar um nível de compatibilidade de banco de dados inferior a 130, mas em alguns casos, o SQL Server encontra um problema com o WITH cláusula primeiro.

Encontrei este erro ao executar OPENJSON() válido código, mas em um banco de dados onde o nível de compatibilidade era apenas 120.

OPENJSON() está disponível apenas em bancos de dados com nível de compatibilidade de 130 ou superior.

Quando verifiquei o nível de compatibilidade do meu banco de dados, vi que era 120. Aumentei imediatamente para 150 e não recebi mais o erro.

Exemplo do erro


Aqui está um exemplo de código que produz esse erro quando o nível de compatibilidade do banco de dados é inferior a 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)
    );

Resultado:
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.

Corrigir o erro


Você pode corrigir facilmente esse erro alterando o nível de compatibilidade do banco de dados para 130 ou superior.
-- Change compatibility level
ALTER DATABASE Pets  
SET COMPATIBILITY_LEVEL = 150;

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

Resultado:
+-----------------------+
| compatibility_level   |
|-----------------------|
| 150                   |
+-----------------------+

Como alternativa, se você não quiser alterar isso, poderá alternar para um banco de dados que saiba ter um nível de compatibilidade adequado.

Espero que este post ajude alguém que encontre o mesmo erro.