Вставка массивов в соединительные таблицы SQL - PullRequest
0 голосов
/ 14 сентября 2018

В фоновом режиме я получаю данные устройства от API, который имеет вложенные объекты, и несколько массивов, таких как IPAddress, могут иметь несколько адресов. Цель состоит в том, чтобы поместить это в нормализованную базу данных SQL 2016. По возможности я стараюсь избегать переформатирования данных с помощью циклов for и стараюсь избегать курсоров по соображениям производительности. Было бы идеально передать строку с разделителями и сделать так, чтобы SQL выполнял тяжелую работу. В этом примере есть две таблицы, первая для устройств

  1. tblDevices - для этого примера это будет содержать каждое устройство и статические настройки, для простоты просто имя устройства
  2. tblJuncIpAddress - у этой таблицы есть IP-адрес, связанный с устройством, и тип 1 или 2

Я пытался использовать этот пример: https://www.mssqltips.com/sqlservertip/4884/sql-server-2016-stringsplit-function/

Могу ли я обновить \ вставить код с помощью JOIN или CROSS APPLY, чтобы добавить \ обновить устройство и добавить \ обновить IP-адрес? Я пытался что-то вроде этого, но CROSS APPLY не понравился формат.

DECLARE @DeviceName varchar(50) = 'Server123'
DECLARE @IPAddressType1 varchar(250) = '1.2.3.4,1.1.1.1'
DECLARE @IPAddressType2 varchar(250) = '8.8.8.8,9.9.9.9'

INSERT INTO tblFSDevices ('deviceId') Values (@DeviceName)

DECLARE @devId int = SCOPE_IDENTITY()

INSERT INTO tblJuncIpAddress (devId, ipAddress, [type])
SELECT Id, SPL.value, 1
FROM tblDevices
WHERE devId = @devId
CROSS APPLY STRING_SPLIT(@IPAddressType1,',') AS SPL;

Если это имеет значение, код, получающий данные API и вставляющий его, - это Powershell. Я видел другие примеры, когда вы генерируете ('IP1'), ('IP2') и затем делаете INSERT для этих значений в большом количестве, но я не уверен, как вы реализуете UPDATE или INSERT, если вы просто сначала выполнить DELETE, чтобы удалить существующие записи. Я открыт для любого решения, цель состоит в том, чтобы в базу данных было внесено одно> множество значений как можно проще.

1 Ответ

0 голосов
/ 14 сентября 2018

Если вам не нужно хранить свои IP-адреса в виде строки, разделенной запятыми, более простым решением может быть использование нескольких вставок, таких как:

INSERT
INTO tblJuncIpAddress (devId, ipAddress, [type])
VALUES (@devId, @ip1, 1), (@devId, @ip2, 1), (@devId, @ip3, 1)

Если вам необходимо сохранить IP-адреса в виде строки, разделенной запятыми, вы сможете выполнить вставку, подобную этой:

INSERT
INTO tblJuncIpAddress (devId, ipAddress, [type])
SELECT @devId, Value, 1
FROM STRING_SPLIT(@IPAddressType1,',')

Исходя из того, что я вижу, не нужно использовать CROSS APPLY.

...