В фоновом режиме я получаю данные устройства от API, который имеет вложенные объекты, и несколько массивов, таких как IPAddress, могут иметь несколько адресов. Цель состоит в том, чтобы поместить это в нормализованную базу данных SQL 2016. По возможности я стараюсь избегать переформатирования данных с помощью циклов for и стараюсь избегать курсоров по соображениям производительности. Было бы идеально передать строку с разделителями и сделать так, чтобы SQL выполнял тяжелую работу. В этом примере есть две таблицы, первая для устройств
- tblDevices - для этого примера это будет содержать каждое устройство и статические настройки, для простоты просто имя устройства
- 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, чтобы удалить существующие записи. Я открыт для любого решения, цель состоит в том, чтобы в базу данных было внесено одно> множество значений как можно проще.