Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да импортирате JSON файл в таблица на SQL Server

Ако имате 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 засегнати реда)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как бързо да редактирате стойности в таблицата в SQL Server Management Studio?

  2. Добавяне на акаунт в база данни за поща към профил (T-SQL)

  3. Как да използвам SqlCommand за СЪЗДАВАНЕ НА БАЗА ДАННИ с параметризирано db име?

  4. datetime2 срещу datetimeoffset в SQL Server:Каква е разликата?

  5. Динамична PIVOT заявка на SQL Server?