Przykładowy pakiet korzystający z SSIS 2008 R2, który wstawia lub aktualizuje za pomocą operacji wsadowej:
Oto przykładowy pakiet napisany w SSIS 2008 R2
który ilustruje, jak wykonać wstawianie, aktualizować między dwiema bazami danych za pomocą operacji wsadowych.
- Korzystanie z
OLE DB Command
spowolni operacje aktualizacji Twojego pakietu, ponieważ nie wykonywać operacje wsadowe. Każdy wiersz jest aktualizowany indywidualnie.
Przykład wykorzystuje dwie bazy danych, a mianowicie Source
i Destination
. W moim przykładzie obie bazy danych znajdują się na serwerze, ale logika nadal może być stosowana do baz danych znajdujących się na różnych serwerach i lokalizacjach.
Utworzyłem tabelę o nazwie dbo.SourceTable
w mojej źródłowej bazie danych Source
.
CREATE TABLE [dbo].[SourceTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
[IsActive] [bit] NULL
)
Utworzono również dwie tabele o nazwie dbo.DestinationTable
i dbo.StagingTable
w mojej docelowej bazie danych Destination
.
CREATE TABLE [dbo].[DestinationTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
CREATE TABLE [dbo].[StagingTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
Wstawiono około 1,4 miliona wierszy w tabeli dbo.SourceTable
z unikalnymi wartościami w RowNumber
kolumna. Tabele dbo.DestinationTable
i dbo.StagingTable
były puste na początku. Wszystkie wiersze w tabeli dbo.SourceTable
mieć flagę IsActive
ustawione na fałsz.
Utworzono pakiet SSIS z dwoma menedżerami połączeń OLE DB, z których każdy łączy się z Source
i Destination
bazy danych. Zaprojektowano przepływ sterowania, jak pokazano poniżej:
-
Pierwsze
Execute SQL Task
wykonuje instrukcjęTRUNCATE TABLE dbo.StagingTable
względem docelowej bazy danych, aby obciąć tabele pomostowe. -
Następna sekcja wyjaśnia, jak
Data Flow Task
jest skonfigurowany. -
Drugie
Execute SQL Task
wykonuje podaną poniżej instrukcję SQL, która aktualizuje dane wdbo.DestinationTable
korzystając z danych dostępnych wdbo.StagingTable
, zakładając, że istnieje unikalny klucz pasujący między tymi dwiema tabelami. W tym przypadku unikalnym kluczem jest kolumnaRowNumber
.
Skrypt do aktualizacji:
UPDATE D
SET D.CreatedOn = S.CreatedOn
, D.ModifiedOn = S.ModifiedOn
FROM dbo.DestinationTable D
INNER JOIN dbo.StagingTable S
ON D.RowNumber = S.RowNumber
Zaprojektowałem zadanie przepływu danych, jak pokazano poniżej.
-
OLE DB Source
odczytuje dane zdbo.SourceTable
za pomocą polecenia SQLSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1
-
Lookup transformation
służy do sprawdzenia, czy wartość RowNumber już istnieje w tabelidbo.DestinationTable
-
Jeśli rekord nie istnieje, zostanie przekierowany do
OLE DB Destination
nazwany jakoInsert into destination table
, który wstawia wiersz dodbo.DestinationTable
-
Jeśli rekord istnieje , zostanie przekierowany do
OLE DB Destination
nazwany jakoInsert into staging table
, który wstawia wiersz dodbo.StagingTable
. Te dane w tabeli pomostowej zostaną użyte w drugim `Wykonaj zadanie SQL w celu wykonania zbiorczej aktualizacji.
Aby aktywować kilka dodatkowych wierszy dla źródła OLE DB, uruchomiłem poniższe zapytanie, aby aktywować niektóre rekordy
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 1)
OR (RowNumber % 9 = 2)
Pierwsze wykonanie pakietu wyglądało jak pokazano poniżej. Wszystkie wiersze zostały skierowane do tabeli docelowej, ponieważ była pusta. Wykonanie pakietu na moim komputerze zajęło około 3 seconds
.
Uruchom ponownie zapytanie dotyczące liczby wierszy, aby znaleźć liczbę wierszy we wszystkich trzech tabelach.
Aby aktywować kilka dodatkowych wierszy dla źródła OLE DB, uruchomiłem poniższe zapytanie, aby aktywować niektóre rekordy
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 3)
OR (RowNumber % 9 = 5)
OR (RowNumber % 9 = 6)
OR (RowNumber % 9 = 7)
Drugie wykonanie pakietu wyglądało jak pokazano poniżej. 314,268 rows
które zostały wcześniej wstawione podczas pierwszego wykonania, zostały przekierowane do tabeli pomostowej. 628,766 new rows
zostały bezpośrednio wstawione do tabeli docelowej. Wykonanie pakietu na moim komputerze zajęło około 12 seconds
. 314,268 rows
w tabeli docelowej zostały zaktualizowane w drugim wykonaniu zadania SQL danymi przy użyciu tabeli pomostowej.
Uruchom ponownie zapytanie dotyczące liczby wierszy, aby znaleźć liczbę wierszy we wszystkich trzech tabelach.
Mam nadzieję, że to podsuwa Ci pomysł na wdrożenie Twojego rozwiązania.