Jeśli utworzysz podobną tabelę, możesz użyć jej w 2 podejściach do dynamicznego mapowania kolumn w pakiecie SSIS lub musisz programowo zbudować cały pakiet. W tej odpowiedzi postaram się dać ci kilka wskazówek, jak to zrobić.
(1) Budowanie źródłowego polecenia SQL z aliasami
Uwaga:to podejście będzie działać tylko wtedy, gdy wszystkie pliki .dbf mają tę samą liczbę kolumn, ale nazwy są różne
W tym podejściu wygenerujesz polecenie SQL, które będzie używane jako źródło na podstawie identyfikatora pliku i utworzonej tabeli mapowania. Musisz wiedzieć, czy FileID i ścieżka do pliku .dbf są przechowywane w zmiennej. jako przykład:
Zakładając, że nazwa tabeli to inputoutputMapping
Dodaj wykonanie zadania SQL za pomocą następującego polecenia:
DECLARE @strQuery as VARCHAR(4000)
SET @strQuery = 'SELECT '
SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?
SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))
SELECT @strQuery
A na karcie Mapowanie parametrów wybierz zmienną zawierającą identyfikator pliku, który ma zostać zmapowany do parametru 0
oraz zmienną zawierającą nazwę pliku .dbf (alternatywa dla nazwy tabeli) do parametru 1
Ustaw typ ResultSet na Single Row
i zapisz zestaw wyników 0
wewnątrz zmiennej typu string jako przykład @[User::SourceQuery]
Wartość ResultSet będzie następująca:
SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1
W OLEDB Source
wybierz tryb dostępu do tabeli na polecenie SQL ze zmiennej i użyj @[User::SourceQuery]
zmienna jako źródło.
(2) Używanie komponentu skryptu jako źródła
W tym podejściu musisz użyć komponentu skryptu jako źródła w zadaniu przepływu danych:
Przede wszystkim musisz przekazać ścieżkę pliku .dbf i połączenie SQL Server do komponentu skryptu za pomocą zmiennych, jeśli nie chcesz ich na stałe kodować.
W edytorze skryptów musisz dodać kolumnę wyjściową dla każdej kolumny znalezionej w tabeli docelowej i zmapować je na miejsce docelowe .
Wewnątrz skryptu musisz wczytać plik .dbf do tabeli danych:
- C# Czytaj z plików .DBF do tabeli danych
- Załaduj DBF do DataTable
Po załadowaniu danych do tabeli danych, wypełnij również inną tabelę danych danymi znalezionymi w tabeli mapowania utworzonej w SQL Server.
Następnie przejdź przez kolumny tabeli danych i zmień .ColumnName
do odpowiedniej kolumny danych wyjściowych, na przykład:
foreach (DataColumn col in myTable.Columns)
{
col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First();
}
Po pętli nad każdym wierszem w tabeli danych i utwórz wiersz wyjściowy skryptu.
Ponadto należy pamiętać, że podczas przypisywania wierszy wyjściowych należy sprawdzić, czy kolumna istnieje, można najpierw dodać nazwy wszystkich kolumn do listy ciągu, a następnie użyć tego do sprawdzenia, na przykład:
var columnNames = myTable.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.ToList();
foreach (DataColumn row in myTable.Rows){
if(columnNames.contains("CustCode"){
OutputBuffer0.CustCode = row("CustCode");
}else{
OutputBuffer0.CustCode_IsNull = True
}
//continue checking all other columns
}
Jeśli potrzebujesz więcej informacji na temat używania komponentu skryptów jako źródła, sprawdź jeden z następujących łączy:
- Składnik skryptów SSIS jako źródło
- Tworzenie źródła za pomocą komponentu skryptu
- Komponent skryptu jako źródło – SSIS
- SSIS – UŻYWANIE KOMPONENTU SKRYPTU JAKO ŹRÓDŁA
(3) Dynamiczne budowanie pakietu
Nie sądzę, że istnieją inne metody, których możesz użyć do osiągnięcia tego celu, z wyjątkiem tego, że masz możliwość dynamicznego zbudowania pakietu, wtedy powinieneś skorzystać z:
- BIML
- Model obiektów zarządzanych usług integracyjnych
- Biblioteka EzApi
(4) SchemaMapper:biblioteka klas mapowania schematów C#
Niedawno rozpocząłem nowy projekt na Git-Hub, który jest biblioteką klas stworzoną w C#. Możesz go użyć do importowania danych tabelarycznych z programu Excel, word, PowerPoint, text, csv, html, json i xml do tabeli serwera SQL z inną definicją schematu przy użyciu podejścia mapowania schematu. sprawdź to na:
- SchemaMapper:Biblioteka klas mapowania schematów C#
Możesz śledzić tę stronę Wiki, aby uzyskać przewodnik krok po kroku:
- Importuj dane z wielu plików do jednej tabeli SQL przewodnik krok po kroku