Si vous essayez d'exécuter certains OPENJSON()
code dans SQL Server, mais vous obtenez l'erreur Msg 319, niveau 15 "Syntaxe incorrecte près du mot-clé 'with'", une possibilité est que vous ayez vraiment une erreur de syntaxe.
Mais si vous avez vérifié et revérifié et que vous êtes convaincu qu'il n'y a pas d'erreur de syntaxe, il se peut en fait que l'erreur soit un effet secondaire du mauvais niveau de compatibilité de la base de données.
Normalement, vous obtiendrez l'erreur Msg 208, niveau 16 "Nom d'objet invalide 'OPENJSON'." lors de l'utilisation d'un niveau de compatibilité de base de données inférieur à 130, mais dans certains cas, SQL Server rencontre un problème avec le WITH
clause en premier.
J'ai rencontré cette erreur lors de l'exécution de OPENJSON()
valides code, mais sur une base de données où le niveau de compatibilité n'était que de 120.
OPENJSON()
n'est disponible que sur les bases de données avec un niveau de compatibilité de 130 ou plus.
Lorsque j'ai vérifié le niveau de compatibilité de ma base de données, j'ai vu qu'il était de 120. Je l'ai immédiatement augmenté à 150 et je n'ai plus eu l'erreur.
Exemple d'erreur
Voici un exemple de code qui produit cette erreur lorsque le niveau de compatibilité de la base de données est inférieur à 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)
);
Résultat :
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.
Corrigez l'erreur
Vous pouvez facilement corriger cette erreur en modifiant le niveau de compatibilité de la base de données sur 130 ou plus.
-- Change compatibility level
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
-- Check compatibility level
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Résultat :
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
Alternativement, si vous ne voulez pas changer cela, vous pouvez passer à une base de données dont vous savez qu'elle a un niveau de compatibilité approprié.
J'espère que ce message aidera quelqu'un qui rencontre la même erreur.