#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, например, с помощью назначения скрипта, которое выполняет вставку и извлекает идентификатор пользователя для второй вставки, но я вполне уверен, что производительность при таком подходе сильно снизится.