2010-05-13 2 views
2

Я новичок в SSIS, поэтому, пожалуйста, со мной.Преобразование данных SSIS

Я пытаюсь перенести данные с одного db на новый. Я получаю данные из одной таблицы, скажу, что я выбрал имя человека, а затем вставляю это в выражение «Человек таблицы». это создаст personID, который я хочу вставить в адресную таблицу. Каким должен быть подход с использованием SSIS. Какие-либо предложения.

ответ

0

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

+0

Как вы предлагаете получить идентификатор человека из первой вставленной таблицы? –

5

У вас есть несколько способов пойти сюда.

  1. Если это одноразовая загрузка таблицы, я бы рекомендовал использовать SET IDENTITY_INSERT ON перед вставкой. Это позволит вам самостоятельно вставлять идентификационную информацию, тем самым отрицая необходимость извлечь ключ. Вам нужно будет использовать задачу сценария или такую, чтобы создать последовательность клавиш.
  2. Используйте задачу SQL Command для выполнения вставки stat, а затем выполните SELECT SCOPE_IDENTITY(), чтобы вывести идентификатор вставки в параметр, возвращаемый из задачи SQL Command. Это рискованно, поскольку вы не можете быть guranteed @@. Это реальный риск, если с другими пользователями происходит несколько вложений.

Итак, если вы решите пойти на # 2, вот как вы это сделаете.

Создание двух таблиц для представления вашего старого Sytem и новая система:

CREATE TABLE [dbo].[Person](
    [ID] [int] IDENTITY(100,1) NOT NULL, 
    [FirstName] [varchar](50) NULL, 
    [LastName] [varchar](50) NULL 
) ON [PRIMARY]; 

CREATE TABLE [dbo].[Person_OldSystem](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [FirstName] [varchar](50) NULL, 
    [LastName] [varchar](50) NULL 
) ON [PRIMARY]; 

Заполнить лицо таблицы с двумя входами:

alt text http://www.freeimagehosting.net/uploads/ff56e32bea.gif

Создайте хранимую процедуру для вставки и возврата новый идентификатор:

ALTER PROCEDURE [dbo].[sp_InsertPerson] 
    @Fname varchar(50), 
    @Lname varchar(50), 
    @id integer OUTPUT 
AS 
BEGIN 

    INSERT INTO QandA..Person (FirstName, LastName) VALUES (@Fname, @Lname); 
    SELECT @id = SCOPE_IDENTITY(); 

END 

Затем мы настроим пакет SSIS. В этом примере пакета добавьте одну задачу потока данных. В Задаче потока данных добавьте следующие задачи и подключите их, как показано.

alt text http://www.freeimagehosting.net/uploads/5348332a9e.gif

Примечание телезрители данных там, чтобы показать вам результаты, как мы продвигаемся.

Настройте исходную задачу OLE DB, чтобы вытащить все столбцы из таблицы Person_OldSystem.

Настройка Производный столбец задач, чтобы добавить столбец под названием '' NewID

alt text http://www.freeimagehosting.net/uploads/a5c6c9e7c6.gif

Настройте OLE DB Command Task со следующим SQL.

EXEC sp_InsertPerson ?, ?, ? OUTPUT 

В окне Дополнительные свойства в OLE DB Задача Команда, установите на следующие отображения столбцов:

alt text http://www.freeimagehosting.net/uploads/2224622431.gif

Так что мы сделали с потоком данных, чтобы извлечь список людей из старой системы. Затем мы добавляем новый столбец под названием NewID, чтобы сохранить личность строки, когда она вставлена ​​в новую таблицу.

alt text http://www.freeimagehosting.net/uploads/8162127377.gif

БД Команда OLE вызывает нашу хранимую процедуру, которая делает вставку и reutrn идентификатор новой строки в последнем параметре. Этот возвращенный идентификатор затем отображается в столбец в потоке данных, который мы для него готовы.

alt text http://www.freeimagehosting.net/uploads/97dbfba277.gif

Условное разделение есть, чтобы дать поток данных куда-то идти.

+0

никогда не предлагать идентификацию @@, это плохо для целостности данных, поскольку она не всегда возвращает правильную идентификацию. Scope_identity - это функция, в которой вы нуждаетесь, или еще лучше выходное предложение. – HLGEM

+0

Моя проблема заключается в добавлении сопоставлений в таблицу назначения, в которой отображается только имя человека. Как я могу получить сгенерированное лицо и вставить его в другую таблицу, так как нет другого окна, доступного как таковое для сопоставления с несколькими таблицами назначения. – bbbbb

+0

HLGEM - Вы правы. @@ может быть плохой. Я исправил свою запись и добавил намного больше деталей. –

0

Создать еще одну задачу потока управления и в секции потока данных, принести PersonId из таблицы источника, который вы сказали, как Person таблицы и вставить в таблицу назначения, которая является таблица Адрес

+0

Как бы вы предложили вывести id из первой таблицы? –

0

Все зависит от конкретного ситуация. Вот несколько возможностей:

  1. У вас есть ключ бизнеса (например, имя человека - все, что однозначно идентифицирует Person запись) лиц доступны при загрузке таблицы адресов? Если да, используйте это для выполнения поиска в таблице Person.

  2. Или вы больше ищете способ создания новых записей адресов для вновь созданных лиц? В этом случае идеальной ситуацией было бы то, что у вас есть поле Созданное datetime в таблице Person, которое будет заполнено в тот момент, когда будут вставлены Лица. Затем вы можете использовать эту метку времени для извлечения всех идентификаторов Person, например, всех записей Person с помощью Created> самой большой Созданной метки времени в таблице Address.

Опять же, все зависит от того, что вышеизложенное может потребоваться для адаптации к конкретной ситуации. Надеюсь, вы все-таки начали.

Смежные вопросы