Si vous rencontrez l'erreur Msg 208, Niveau 16 "Nom d'objet invalide 'OPENJSON'.", vous essayez probablement d'utiliser le OPENJSON()
fonction sur une base de données avec un niveau de compatibilité inférieur à 130.
OPENJSON()
est uniquement disponible sous le niveau de compatibilité 130 ou supérieur.
Pour résoudre ce problème, augmentez le niveau de compatibilité de votre base de données à 130 ou plus, ou passez à une base de données qui a déjà le niveau de compatibilité approprié.
Exemple d'erreur
Voici un exemple de code de base qui provoquera cette erreur.
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
Résultat :
Msg 208, Niveau 16, État 1, Ligne 1Nom d'objet non valide 'OPENJSON'.
Lorsque le niveau de compatibilité de votre base de données est inférieur à 130, SQL Server ne parvient pas à trouver et à exécuter OPENJSON()
fonction.
Dans mon cas, la base de données sur laquelle j'essayais de l'exécuter avait un niveau de compatibilité de 120.
Vérifiez le niveau de compatibilité de la base de données
Vous pouvez interroger sys.databases
pour vérifier le niveau de compatibilité de la base de données (ou de toutes les bases de données si vous préférez).
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Résultat :
+-----------------------+| niveau_compatibilité ||-----------------------|| 120 |+-----------------------+
Comme suspecté, cette base de données a un niveau de compatibilité inférieur à 130.
Solution 1
La solution la plus évidente consiste à augmenter le niveau de compatibilité de la base de données pour laquelle vous essayez d'exécuter OPENJSON()
contre.
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
L'exécution de ce code augmentera le niveau de compatibilité de la base de données à 150, ce qui est plus que suffisant pour prendre en charge OPENJSON()
fonction.
Si nous vérifions à nouveau le niveau de compatibilité, nous pouvons voir qu'il est passé à 150.
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
Résultat :
+-----------------------+| niveau_compatibilité ||-----------------------|| 150 |+-----------------------+
Nous pouvons maintenant exécuter le code d'origine sans erreur.
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
Résultat :
+-------+---------+--------+| clé | valeur | tapez ||-------+---------+--------|| 0 | Chat | 1 || 1 | Chien | 1 || 2 | Oiseau | 1 |+-------+---------+--------+
Solution 2
Si, pour une raison quelconque, vous ne pouvez pas ou ne voulez pas modifier le niveau de compatibilité de la base de données, vous pouvez passer à une base de données qui possède déjà le niveau de compatibilité approprié.
Évidemment, cela peut convenir ou non, selon que vous devez ou non insérer votre JSON analysé dans la base de données.
Quoi qu'il en soit, pour ce faire, vous pouvez interroger sys.databases
pour une base de données appropriée.
SELECT
name,
compatibility_level
FROM sys.databases;
Résultat :
+--------------------+-----------------------+| nom | niveau_compatibilité ||--------------------+----------------------|| maître | 150 || tempdb | 150 || modèle | 150 || msdb | 150 || Musique | 150 || Tester | 150 || WideWorldImporters | 130 || Monde | 140 || Animaux | 120 |+--------------------+-----------------------+Heureusement dans ce cas, toutes les autres bases de données sont 130 ou plus. Nous pourrions donc passer à n'importe lequel d'entre eux.
USE World; SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
Résultat :
+-------+---------+--------+| clé | valeur | tapez ||-------+---------+--------|| 0 | Chat | 1 || 1 | Chien | 1 || 2 | Oiseau | 1 |+-------+---------+--------+