Как разделить строку данных и вставить каждую строку (но разные столбцы) в две таблицы (с отношением FK) в службах SSIS?

#sql-server #visual-studio #ssis

Вопрос:

У меня есть две таблицы в SQL Server:

Человек

 ID (PK, int, IDENTITY)
Name (varchar(100))
UploadedBy (varchar(50))
DateAdded (datetime)
 

Личное дело

 ID (PK, int, IDENTITY)
PersonId (FK, int)
PersonFile (varchar(max))
 

Я читаю в большом файле (150 МБ), и у меня есть компонент сценария, который может успешно разобрать файл на несколько столбцов. Проблема в том, что мне нужно сначала вставить первые 3 столбца моей строки проанализированных данных в таблицу Person, а затем использовать идентификатор этой строки для вставки последнего столбца в таблицу PersonFile. Есть ли простой способ сделать это в SSIS?

Я полагаю, что технически я мог бы написать все по сценарию для обработки вставок в базу данных, но я чувствую, что в этом случае я мог бы просто вообще отказаться от службы SSIS и пользовательского powershell. Я также подумал о написании процедуры в SQL server, а затем передаче информации процедуре для обработки вставок. Но опять же, это кажется очень неэффективным.

Как мне лучше всего вставить строку данных в две таблицы, если в одной из них есть ограничение внешнего ключа?

Ответ №1:

Я думаю, что лучший способ-использовать таблицу этапов в базе данных для хранения проанализированного исходного файла, а затем использовать хранимые процедуры или SQL-запрос для загрузки ваших таблиц. В службах SSIS есть компонент поиска, который можно использовать в вашем случае, но я стараюсь избегать его по разным причинам.

Создайте таблицу, аналогичную исходному файлу, что-то вроде:

 CREATE TABLE dbo.[SourceFileName](
  Name nvarchar(100) NULL,
  UploadedBy nvarchar(50) NULL,
  DateAdded datetime NULL,
  PersonFile nvarchar(max) NULL
)
 

Урежьте столик на сцене. Используйте компонент потока данных для получения исходных данных. Используйте сценарий или хранимые процедуры для вставки исходных данных в целевую таблицу (начните с Person и загрузите PersonFile). Поток данных служб SSIS должен выглядеть примерно так:

введите описание изображения здесь

Для сценария вставки для человека сделайте что-то вроде:

 INSERT INTO dbo.Person (Name, UploadedBy,DateAdded)
SELECT Name,UploadedBy,DateAdded
FROM dbo.SourceFileName;
 

Для вставки в файл персоны создайте соединение с целевой таблицей:

 INSERT INTO dbo.PersonFile(PersonId,PersonFile)
SELECT
  Person.ID,
  SourceFile.PersonFile
FROM dbo.SourceFileName SourceFile
JOIN dbo.Person Person
ON Person.Name = SourceFile.Name
 

Вы также должны добавить a UNIQUE CONSTRAINT в столбец, который идентифицирует человека (например, имя).

Ответ №2:

Одна очень распространенная вещь, которую нужно сделать, — это сначала подготовить данные.

Таким образом, вы вставляете все столбцы в таблицу на сервере, в которой также есть дополнительный обнуляемый столбец для идентификатора человека.

Тогда у вас будет хранимая процедура, которая вставляет уникальные записи о персонах в таблицу персон и обновляет промежуточную таблицу полученным идентификатором персоны, который является дополнительным полем, необходимым для вставки файла персоны, что затем может быть выполнено либо в той же процедуре, либо в другой. (Вы бы вызвали эти процедуры в SSIS с помощью задачи Выполнить SQL.)

Я полагаю, что это можно было бы сделать чисто в службах SSIS, например, с помощью назначения скрипта, которое выполняет вставку и извлекает идентификатор пользователя для второй вставки, но я вполне уверен, что производительность при таком подходе сильно снизится.