sql >> データベース >  >> RDS >> Sqlserver

「無効なオブジェクト名「OPENJSON」」の修正方法。 SQLServerで

    エラーメッセージ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      |
    +-------+---------+--------+


    1. 3つのテーブルの内部結合

    2. MariaDB FIELD()とFIND_IN_SET():違いは何ですか?

    3. 使用中のSQLServerのバージョンはデータ型datetime2をサポートしていませんか?

    4. Oracle regexp_replaceによってスペースで区切られたリストから重複を削除するにはどうすればよいですか?