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)