2011-08-31 19 views
10

Jestem nowy w SSIS i potrzebuję pomocy w tej sprawie. Znalazłem numer article, który opisuje, jak wykrywać istniejące wiersze i które uległy zmianie. Brakującą częścią jest aktualizacja zaktualizowanych wierszy. Znalazłem kilka artykułów, które mówią, że jest to również dobre rozwiązanie do usuwania rekordów, które uległy zmianie i wstawienia nowego zestawu rekordów. Chodzi o to, że nie wiem jak zrobić ten krok usuwania (czerwone pole).SSIS - Usuń wiersze

Wszelkie sugestie?

enter image description here

Odpowiedz

17

Jeśli trzeba usunąć wiersze ciągu Data Flow Task, następnie trzeba użyć transformacji OLE DB Command i napisać DELETE jak DELETE FROM dbo.Table WHERE ColumnName = ?. Następnie w odwzorowaniach kolumn transformacji poleceń OLE DB zmapujesz parametr reprezentowany przez znak zapytania danymi pochodzącymi z poprzedniej transformacji. W twoim przypadku dane pochodzące z Unii Wszystkie 2.

Jednak nie polecam tej opcji, ponieważ Polecenie OLE DB wykonuje dla każdego wiersza i może spowolnić pakiet, jeśli jest za dużo wierszy.

Polecam coś takiego:

  1. przekierować wyjście z Union All 2 do tabeli tymczasowej pomostowym (słownie dbo.Staging) używając OLE DB Destination.

  2. Załóżmy, że ostateczny stół docelowy to dbo.Destination. Teraz Twoja tabela pomostowa zawiera wszystkie rekordy, które powinny zostać usunięte z tabeli Miejsce docelowe.

  3. Na Przepływ sterowania karcie , umieścić Execute SQL Task po Data Flow Task. W Execute SQL Task napisz instrukcję SQL lub użyj procedury przechowywanej, która wywoła instrukcję SQL, aby dołączyć do rekordów między etapami i miejscem docelowym, aby usunąć wszystkie pasujące wiersze z tabeli docelowej.

  4. Umieść także inne zadanie wykonywania SQL przed zadaniem przepływu danych. W tym Execute SQL Task usuń/obcnij wiersze z tabeli pomostowej.

Coś w tym stylu może działać, aby usunąć wiersze :.

DELETE  D 
FROM  dbo.Destination D 
INNER JOIN dbo.Staging  S 
ON   D.DestinationId = S.StagingId 

Nadzieję, że pomaga.

+0

To brzmi jak dobry plan.Spróbuję teraz i pokażę ci wyniki. Dziękuję Ci Siva! –

+3

Btw, jaka jest Twoja sugestia dotycząca zrobienia tabeli dbo.Staging? Utwórz nowe zadanie przepływu danych, które spowoduje usunięcie tej tabeli? Czy mogę usunąć tylko dane i pozostawić tam zawsze tabelę tymczasową? –

-4

Polecam użyć łyżki (czajnik) jest bardziej elastyczny, ma narzędzie do projektowania o nazwie "Wyszukiwanie/aktualizacja wymiaru", które pomaga w utrzymaniu tabeli wymiarów, można określić, która akcja ma być zależna od zmian kolumn (zaktualizuj rekord, wstaw nowy rekord) wszystko na podstawie kontroli wersji czasowej rekordów.

1

Oprócz user756519 answer. Jeśli masz miliony rekordów do usunięcia, ostatni krok (4) dla instrukcji ExecuteSQL Delete można wykonać w partiach z czymś podobnym do tego:

WHILE (1=1) 
BEGIN 
    DELETE D 
    from dbo.Destination D 
    inner join 
    (
     -- select ids that should be removed from table 
     SELECT TOP(10000) DestinationId 
     FROM 
      (
      SELECT 
       D1.DestinationId, 
       S.StagingId 
      from 
       dbo.Destination as D1 
      LEFT JOIN 
       dbo.Staging as S 
      ON 
       D1.DestinationId = S.StagingId 
      ) AS G 
     WHERE 
      StagingId IS NULL 
    ) as R 
    on D.DestinationId = R.DestinationId; 

    IF @@ROWCOUNT < 1 BREAK 

    -- info message 
    DECLARE @timestamp VARCHAR(50) 
    SELECT @timestamp = CAST(getdate() AS VARCHAR) 
    RAISERROR ('Chunk deleted %s', 10, 1,@timestamp) WITH NOWAIT 
END