Хранение массива json в таблице SQL - PullRequest
0 голосов
/ 01 июля 2019

У меня есть две таблицы: пользователь и телефон.Настольный телефон имеет ссылку на стол пользователя.Это позволяет использовать несколько телефонных номеров для каждого пользователя.

Я отправляю информацию на сервер SQL в формате json, но изо всех сил стараюсь сохранить телефонные номера.Это то, что у меня пока есть:

CREATE TABLE [dbo].[user](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[phone](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [userId] [int] NOT NULL,
    [type] [varchar](12) NOT NULL,
    [phone] [varchar](12) NOT NULL
) ON [PRIMARY]
GO

DECLARE @jsonVariable NVARCHAR(MAX)

SET @jsonVariable = N'{
   "name":"Joe Smith",
   "phones":[
      {
         "phone":"+1 123 123-4567",
         "type":"business"
      },
      {
         "phone":"+1 987 987-6543",
         "type":"mobile"
      }
   ]
}'

DECLARE @userId int
DECLARE @userName varchar(max) = (SELECT userName FROM OPENJSON (@jsonVariable) WITH (userName varchar(max) N'$.name'))
INSERT INTO [dbo].[user] ([name]) VALUES (@userName)

SET @userId = @@IDENTITY

Вопрос сейчас такой: есть ли что-то вроде процедуры forEach для хранения всех телефонных номеров?

1 Ответ

0 голосов
/ 02 июля 2019

Вы можете использовать OPENJSON, чтобы получить все записи из массива телефонов в вашем json.

Попробуйте это как часть существующего кода:

INSERT INTO [dbo].[phone] (
                              [userId]
                            , [type]
                            , [phone]
                          )
            SELECT @userId
                 , [c].[type]
                 , [c].[phone]
            FROM   [dbo].[user] [a]
            INNER JOIN OPENJSON(@jsonVariable)
                       WITH (
                                [userName] VARCHAR(MAX) '$.name'
                              , [phones] NVARCHAR(MAX) AS JSON --bring your phones array back out.
                            ) AS [b]
                ON [b].[userName] = [a].[name]
            CROSS APPLY OPENJSON([b].[phones]) --Cross apply to get all records. This will return all the records in phones for the specific user you have inserted in dbo.[user]
                       WITH (
                                [phone] NVARCHAR(12) '$.phone'
                              , [type] NVARCHAR(12) '$.type'
                            ) [c];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...