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

OPENJSON「キーワード「with」の近くの構文が正しくありません。」 SQL Server(解決済み)

    OPENJSON()を実行しようとしている場合 SQL Serverのコードですが、エラーメッセージ319、レベル15「キーワード「with」の近くの構文が正しくありません」が発生します。1つの可能性として、実際に構文エラーが発生している可能性があります。

    ただし、チェックして再チェックし、構文エラーがないと確信している場合は、実際には、エラーがデータベースの互換性レベルが間違っていることの副作用である可能性があります。

    通常、エラーメッセージ208、レベル16「無効なオブジェクト名「OPENJSON」」が発生します。 130未満のデータベース互換性レベルを使用している場合でも、場合によっては、SQLServerがWITHに問題を検出します。 最初の条項。

    有効なOPENJSON()を実行しているときにこのエラーが発生しました コードですが、互換性レベルが120しかないデータベース上にあります。

    OPENJSON() 互換性レベルが130以上のデータベースでのみ使用できます。

    データベースの互換性レベルを確認したところ、120であることがわかりました。すぐに150に増やしたところ、エラーは発生しなくなりました。

    エラーの例

    これは、データベースの互換性レベルが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)
        );

    結果:

    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.

    エラーを修正する

    データベースの互換性レベルを130以上に変更することで、このエラーを簡単に修正できます。

    -- Change compatibility level
    ALTER DATABASE Pets  
    SET COMPATIBILITY_LEVEL = 150;
    
    -- Check compatibility level
    SELECT compatibility_level
    FROM sys.databases
    WHERE name = 'Pets';

    結果:

    +-----------------------+
    | compatibility_level   |
    |-----------------------|
    | 150                   |
    +-----------------------+

    または、これを変更したくない場合は、適切な互換性レベルがあることがわかっているデータベースに切り替えることができます。

    うまくいけば、この投稿が同じエラーに遭遇した誰かに役立つことを願っています。


    1. NOT IN、OUTER APPLY、LEFT OUTER JOIN、EXCEPT、またはNOT EXISTSを使用する必要がありますか?

    2. SQLServerデータベースのバージョン管理

    3. ClusterControlでのProxySQLクラスタリングの概要

    4. OracleのROWIDTONCHAR()関数