エラーメッセージ208、レベル16「無効なオブジェクト名「OPENJSON」」が発生した場合は、おそらくOPENJSON()
を使用しようとしています。 互換性レベルが130未満のデータベースで機能します。
OPENJSON()
互換性レベル130以上でのみ使用できます。
これを修正するには、データベースの互換性レベルを130以上に上げるか、適切な互換性レベルがすでにあるデータベースに変更します。
エラーの例
このエラーの原因となる基本的なコードの例を次に示します。
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
結果:
Msg 208, Level 16, State 1, Line 1 Invalid object name 'OPENJSON'.
データベースの互換性レベルが130未満の場合、SQLServerはOPENJSON()
を見つけて実行できません。 機能。
私の場合、これを実行しようとしたデータベースの互換性レベルは120でした。
データベースの互換性レベルを確認する
sys.databases
にクエリを実行できます データベース(または必要に応じてすべてのデータベース)の互換性レベルを確認します。
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
結果:
+-----------------------+ | compatibility_level | |-----------------------| | 120 | +-----------------------+
疑われるように、このデータベースの互換性レベルは130未満です。
ソリューション1
最も明白な解決策は、OPENJSON()
を実行しようとしているデータベースの互換性レベルを上げることです。 に対して。
ALTER DATABASE Pets
SET COMPATIBILITY_LEVEL = 150;
そのコードを実行すると、データベースの互換性レベルが150に上がります。これは、OPENJSON()
をサポートするのに十分なレベルです。 機能。
互換性レベルをもう一度確認すると、150に増加していることがわかります。
SELECT compatibility_level
FROM sys.databases
WHERE name = 'Pets';
結果:
+-----------------------+ | compatibility_level | |-----------------------| | 150 | +-----------------------+
これで、元のコードをエラーなしで実行できます。
USE Pets;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
結果:
+-------+---------+--------+ | key | value | type | |-------+---------+--------| | 0 | Cat | 1 | | 1 | Dog | 1 | | 2 | Bird | 1 | +-------+---------+--------+
ソリューション2
何らかの理由でデータベースの互換性レベルを変更できない、または変更したくない場合は、適切な互換性レベルがすでにあるデータベースに切り替えることができます。
明らかに、これは、解析されたJSONをデータベースに挿入する必要があるかどうかに応じて、適切な場合と適切でない場合があります。
とにかく、これを行うには、sys.databases
にクエリを実行できます 適切なデータベースを探します。
SELECT
name,
compatibility_level
FROM sys.databases;
結果:
+--------------------+-----------------------+ | name | compatibility_level | |--------------------+-----------------------| | master | 150 | | tempdb | 150 | | model | 150 | | msdb | 150 | | Music | 150 | | Test | 150 | | WideWorldImporters | 130 | | World | 140 | | Pets | 120 | +--------------------+-----------------------+
幸い、この場合、他のすべてのデータベースは130以上です。したがって、それらのいずれかに切り替えることができます。
USE World;
SELECT * FROM OPENJSON('["Cat","Dog","Bird"]');
結果:
+-------+---------+--------+ | key | value | type | |-------+---------+--------| | 0 | Cat | 1 | | 1 | Dog | 1 | | 2 | Bird | 1 | +-------+---------+--------+