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)