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

JSONファイルをSQLServerテーブルにインポートする方法

    JSONドキュメントがある場合は、SQLServerに取り込む方法がいくつかあります。

    小さなドキュメントの場合は、その内容をコピーして貼り付けることができます。大きいドキュメント(または小さいドキュメント)の場合は、ファイル全体をインポートすることをお勧めします。

    この記事では、JSONファイルをSQLServerデータベースにインポートする例を示します。

    JSONファイルのコンテンツの選択

    T-SQLにはOPENROWSET()が含まれています ローカルドライブまたはネットワーク上の任意のファイルからデータを読み取り、それを行セットとして返すことができる関数。これを行うには、BULKを使用してこの関数を実行します オプション。

    この記事はJSONファイルをテーブルにインポートするために特別に作成されましたが、OPENROWSET()を使用することもできます。 必ずしもテーブルにロードせずにデータファイルから読み取ること。

    これにより、データをテーブルにロードする前に、最初にデータを確認できます。

    JSONファイルのコンテンツを選択する例を次に示します。

    SELECT BulkColumn FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB
        ) AS [Json];

    結果:

    +--------------+
    | BulkColumn   |
    |--------------|
    | { 
        "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" }
            ]
        }
    }              |
    +--------------+

    この場合、ファイルシステムはLinuxであるため、アップロードするファイルを指定するときにLinuxパス規則が使用されます。

    Windowsを使用している場合、ファイルパスは次のようになります。

    SELECT BulkColumn FROM OPENROWSET (
        BULK 'D:\data\pets.json', 
        SINGLE_CLOB
        ) AS [Json];

    とにかく、上記のJSONファイルの内容を見ることができます。それをテーブルにロードしましょう。

    テーブルにロード

    前のステートメントを変更して、ファイルの内容がテーブルに直接インポートされるようにすることができます。

    -- Import it directly into the table
    SELECT BulkColumn INTO ImportedJson FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB
        ) AS [Json];
    
    -- Select the contents of the table
    SELECT * FROM ImportedJson;

    結果:

    +--------------+
    | BulkColumn   |
    |--------------|
    | { 
        "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" }
            ]
        }
    }              |
    +--------------+

    これを行うと、テーブルが作成され、JSONが挿入されます。

    OPENROWSET()を使用する場合は注意してください BULKで オプションの場合、FROMに相関名(範囲変数またはエイリアスとも呼ばれます)も指定する必要があります 句。

    相関名を指定しないと、エラーが発生します。

    私の例では、Jsonを使用しました 相関名として使用できますが、自由に選択してください。

    JSONを行と列に解析します

    これは物事がエキサイティングになるところです。ファイルの内容をアップロードしてテーブルの列にインポートできるだけでなく、その内容を複数の行と列に分けることもできます。

    OPENJSON() JSONドキュメントを表形式に変換するテーブル値関数です。

    したがって、OPENJSON()を使用できます JSONファイルの内容を表形式に変換し、それを1つのテーブルに挿入するか、それが目的の場合は複数のテーブルに挿入します。

    ただし、データをテーブルに挿入する前にデータを確認できます。

    -- Select the cats
    SELECT Cats.* FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB) AS [Json]
        CROSS APPLY OPENJSON ( BulkColumn, '$.pets.cats' )
        WITH  (
                CatId     int             '$.id',  
                CatName   varchar(60)     '$.name', 
                Sex       varchar(6)      '$.sex'  
            ) AS [Cats]
    
    -- Select the dogs
    SELECT Dogs.* FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB) AS [Json]    
        CROSS APPLY OPENJSON ( BulkColumn, '$.pets.dogs' )
        WITH  (
                DogId     int             '$.id',  
                DogName   varchar(60)     '$.name', 
                Sex       varchar(6)      '$.sex'  
            ) AS [Dogs]

    結果:

    +---------+-----------+--------+
    | CatId   | CatName   | Sex    |
    |---------+-----------+--------|
    | 1       | Fluffy    | Female |
    | 2       | Long Tail | Female |
    | 3       | Scratch   | Male   |
    +---------+-----------+--------+
    (3 rows affected)
    +---------+-----------+--------+
    | DogId   | DogName   | Sex    |
    |---------+-----------+--------|
    | 1       | Fetch     | Male   |
    | 2       | Fluffy    | Male   |
    | 3       | Wag       | Female |
    +---------+-----------+--------+
    (3 rows affected)

    これは、2つのテーブルに挿入された後の外観とまったく同じです。

    テーブルに挿入するには、INTO TableNameを追加するだけです。 SELECTの間 パーツとFROM (ここで、TableName 作成するテーブルの名前です。

    -- Insert cats into a table
    SELECT Cats.* INTO ImportedCats
    FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB) AS [Json]
        CROSS APPLY OPENJSON ( BulkColumn, '$.pets.cats' )
        WITH  (
                CatId     int             '$.id',  
                CatName   varchar(60)     '$.name', 
                Sex       varchar(6)      '$.sex'  
            ) AS [Cats]
    
    -- Insert dogs into a table
    SELECT Dogs.* INTO ImportedDogs
    FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB) AS [Json]    
        CROSS APPLY OPENJSON ( BulkColumn, '$.pets.dogs' )
        WITH  (
                DogId     int             '$.id',  
                DogName   varchar(60)     '$.name', 
                Sex       varchar(6)      '$.sex'  
            ) AS [Dogs]
    
    -- Select the results from both tables
    SELECT * FROM ImportedCats
    SELECT * FROM ImportedDogs

    結果:

    +---------+-----------+--------+
    | CatId   | CatName   | Sex    |
    |---------+-----------+--------|
    | 1       | Fluffy    | Female |
    | 2       | Long Tail | Female |
    | 3       | Scratch   | Male   |
    +---------+-----------+--------+
    (3 rows affected)
    +---------+-----------+--------+
    | DogId   | DogName   | Sex    |
    |---------+-----------+--------|
    | 1       | Fetch     | Male   |
    | 2       | Fluffy    | Male   |
    | 3       | Wag       | Female |
    +---------+-----------+--------+
    (3 rows affected)

    これらのテーブルは、WITHで提供した列定義を使用して作成されました 条項。

    各JSONキーは、選択した列名にマップされます。

    JSONファイルのキー名に基づいて列名を作成することもできます。その場合、OPENJSON()のように、パスを使用してマップする必要はありません。 それらをJSONキー名と自動的に照合します。

    たとえば、次のWITH句を使用する代わりに:

    WITH  (
                DogId     int             '$.id',  
                DogName   varchar(60)     '$.name', 
                Sex       varchar(6)      '$.sex'  
            ) AS [Dogs]

    これを使用できます:

    WITH  (
            id     int,  
            name   varchar(60), 
            sex    varchar(6)  
        ) AS [Dogs]

    JSONを変数にロードする

    別の方法は、アップロードされたJSONを変数にロードし、その変数をOPENJSON()に渡すことです。 機能。

    -- Declare variable
    DECLARE @json nvarchar(max);
    
    -- Upload JSON data into that variable
    SELECT @json = BulkColumn FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB
        ) AS [Json];
    
    -- Select the cats from that variable
    SELECT * FROM OPENJSON(@json, '$.pets.cats')
    WITH  (
            CatId     int             '$.id',  
            CatName   varchar(60)     '$.name', 
            Sex       varchar(6)      '$.sex'   
        );
    
    -- Select the dogs from that variable
    SELECT * FROM OPENJSON(@json, '$.pets.dogs')
    WITH  (
            DogId     int             '$.id',  
            DogName   varchar(60)     '$.name', 
            Sex       varchar(6)      '$.sex'  
        );

    結果:

    +---------+-----------+--------+
    | CatId   | CatName   | Sex    |
    |---------+-----------+--------|
    | 1       | Fluffy    | Female |
    | 2       | Long Tail | Female |
    | 3       | Scratch   | Male   |
    +---------+-----------+--------+
    (3 rows affected)
    +---------+-----------+--------+
    | DogId   | DogName   | Sex    |
    |---------+-----------+--------|
    | 1       | Fetch     | Male   |
    | 2       | Fluffy    | Male   |
    | 3       | Wag       | Female |
    +---------+-----------+--------+
    (3 rows affected)

    繰り返しますが、これをテーブルに挿入するには、INTO TableNameを追加します。 SELECTの後 一部(TableName 作成するテーブルの名前です。

    サブオブジェクト全体を列にロードする

    サブオブジェクト全体を独自の列に配置する場合は、AS JSONを使用できます。 WITHのオプション 条項。

    たとえば、各猫と犬を3つの列に分散させる代わりに、JSONフラグメント全体が1つの列を占める可能性があります。各動物にはまだ独自の列があります。

    これが私の言いたいことの例です。

    SELECT Cats.* FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB) AS [Json]
        CROSS APPLY OPENJSON ( BulkColumn, '$.pets.cats' )
        WITH  (
                Cats nvarchar(max) '$' AS JSON   
            ) AS [Cats]
    
    SELECT Dogs.* FROM OPENROWSET (
        BULK '/var/opt/mssql/bak/pets.json', 
        SINGLE_CLOB) AS [Json]    
        CROSS APPLY OPENJSON ( BulkColumn, '$.pets.dogs' )
        WITH  (
                Dogs nvarchar(max) '$' AS JSON   
            ) AS [Dogs]

    結果:

    +------------------------------------------------------+
    | Cats                                                 |
    |------------------------------------------------------|
    | { "id" : 1, "name" : "Fluffy", "sex" : "Female" }    |
    | { "id" : 2, "name" : "Long Tail", "sex" : "Female" } |
    | { "id" : 3, "name" : "Scratch", "sex" : "Male" }     |
    +------------------------------------------------------+
    (3 rows affected)
    +-------------------------------------------------+
    | Dogs                                            |
    |-------------------------------------------------|
    | { "id" : 1, "name" : "Fetch", "sex" : "Male" }  |
    | { "id" : 2, "name" : "Fluffy", "sex" : "Male" } |
    | { "id" : 3, "name" : "Wag", "sex" : "Female" }  |
    +-------------------------------------------------+
    (3 rows affected)


    1. JDBCとMySQLを使用した通信リンク障害の解決

    2. SQLServerでのアラートと演算子の使用

    3. カンマ区切りの文字列で値を検索するMySQLクエリ

    4. 集計を含む式で集計関数を実行できないのに、その周りに新しいselectステートメントを作成することで実行できるのはなぜですか?