Ако имате JSON документ, има няколко начина, по които можете да го поставите в SQL Server.
Ако е малък документ, можете да копирате и поставите съдържанието му. Ако това е по-голям документ (или дори малък), може да искате да импортирате целия файл.
Тази статия представя пример за импортиране на JSON файл в база данни на SQL Server.
Избиране на съдържанието на JSON файла
T-SQL включва OPENROWSET()
функция, която може да чете данни от всеки файл на локалния диск или мрежа и да ги върне като набор от редове. За да направите това, изпълнете тази функция с BULK
опция.
Въпреки че тази статия е написана специално за импортиране на JSON файла в таблица, можете също да използвате OPENROWSET()
за четене от файл с данни, без непременно да го зареждате в таблица.
Това ви позволява първо да проверите данните, преди да ги заредите в таблицата.
Ето пример за избор на съдържанието на JSON файл.
SELECT BulkColumn FROM OPENROWSET (
BULK '/var/opt/mssql/bak/pets.json',
SINGLE_CLOB
) AS [Json];
Резултат:
+--------------+| BulkColumn ||--------------|| { "домашни любимци" :{ "котки" :[ { "id" :1, "name" :"Пухкав", "sex" :"Женски" }, { "id" :2, "name" :"Дълга опашка" , "sex" :"Female" }, { "id" :3, "name" :"Scratch", "sex" :"Male" } ], "dogs" :[ { "id" :1, "name" :"Извличане", "sex" :"Мъж" }, { "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 ||--------------|| { "домашни любимци" :{ "котки" :[ { "id" :1, "name" :"Пухкав", "sex" :"Женски" }, { "id" :2, "name" :"Дълга опашка" , "sex" :"Female" }, { "id" :3, "name" :"Scratch", "sex" :"Male" } ], "dogs" :[ { "id" :1, "name" :"Извличане", "sex" :"Мъж" }, { "id" :2, "name" :"Fluffy", "sex" :"Male" }, { "id" :3, "name" :" Wag", "sex" :"Female" } ] }} |+--------------+
Това създава таблицата и вмъква JSON.
Имайте предвид, че когато използвате OPENROWSET()
с BULK
опция, трябва също да предоставите име на корелация (известно също като променлива на диапазон или псевдоним) в FROM
клауза.
Ако не предоставите име на корелация, ще получите грешка.
В моя пример използвах Json
като име на корелация, но не се колебайте да изберете своето.
Разберете JSON на редове и колони
Тук нещата стават вълнуващи. Не само можем да качим съдържанието на файл и да го импортираме в колона на таблица, но също така можем да разделим съдържанието му между множество редове и колони.
OPENJSON()
е функция с таблично значение, която преобразува JSON документи в табличен формат.
Следователно можем да използваме OPENJSON()
да конвертирате съдържанието на нашия JSON файл в табличен формат и да го вмъкнете в таблица или няколко таблици, ако това е целта.
Но отново можем да проверим данните си, преди да ги вмъкнем в каквито и да е таблици.
-- 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 | Име на котка | Секс ||--------+-----------+--------|| 1 | Пухкави | Жена || 2 | Дълга опашка | Жена || 3 | Надраскване | Мъжки |+--------+-----------+-------+(3 засегнати реда)+---------+ -----------+-------+| DogId | Име на куче | Секс ||--------+-----------+--------|| 1 | Вземи | Мъжки || 2 | Пухкави | Мъжки || 3 | Размахване | Жена |+--------+-----------+-------+(3 засегнати реда)Точно така ще изглежда, след като бъде вмъкнат в две таблици.
За да го вмъкнем в таблиците, всичко, което трябва да направим, е да добавим 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 | Име на котка | Секс ||--------+-----------+--------|| 1 | Пухкави | Жена || 2 | Дълга опашка | Жена || 3 | Надраскване | Мъжки |+--------+-----------+-------+(3 засегнати реда)+---------+ -----------+-------+| DogId | Име на куче | Секс ||--------+-----------+--------|| 1 | Вземи | Мъжки || 2 | Пухкави | Мъжки || 3 | Размахване | Жена |+--------+-----------+-------+(3 засегнати реда)
Тези таблици бяха създадени с помощта на дефинициите на колони, които предоставихме в 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 | Име на котка | Секс ||--------+-----------+--------|| 1 | Пухкави | Жена || 2 | Дълга опашка | Жена || 3 | Надраскване | Мъжки |+--------+-----------+-------+(3 засегнати реда)+---------+ -----------+-------+| DogId | Име на куче | Секс ||--------+-----------+--------|| 1 | Вземи | Мъжки || 2 | Пухкави | Мъжки || 3 | Размахване | Жена |+--------+-----------+-------+(3 засегнати реда)
Отново, за да вмъкнем това в таблица, бихме добавили INTO TableName
след SELECT
част (където TableName
е името на таблицата, която искате да създадете).
Заредете цял подобект в колона
Ако искате цели подобекти да се намират в собствената си колона, можете да използвате AS JSON
опция на WITH
клауза.
Например, вместо всяка котка и куче да бъдат разпределени в три колони, целият им JSON фрагмент може да заема една колона. Всяко животно ще има свой собствен ред.
Ето пример за това, което имам предвид.
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]
Резултат:
+------------------------------------------------------- --------+| Котки ||------------------------------------------------------- -------|| { "id" :1, "name" :"Fluffy", "sex" :"Female" } || { "id" :2, "name" :"Дълга опашка", "sex" :"Женски" } || { "id" :3, "name" :"Scratch", "sex" :"Male" } |+------------------------- ----------------------------+(3 засегнати реда)+-------------- ----------------------------------+| Кучета ||------------------------------------------------------- --|| { "id" :1, "name" :"Извличане", "sex" :"Мъж" } || { "id" :2, "name" :"Пухкав", "sex" :"Мъжки" } || { "id" :3, "name" :"Wag", "sex" :"Female" } |+------------------------- ------------------------+(3 засегнати реда)