sql >> Databáze >  >> RDS >> Sqlserver

Úloha SSIS pro nekonzistentní import počtu sloupců?

Z hlavy mám pro vás 50% řešení.

Problém

SSIS opravdu se stará o metadata, takže jejich variace obvykle vedou k výjimkám. DTS bylo v tomto smyslu daleko shovívavější. Tato silná potřeba konzistentních metadat způsobuje, že použití zdroje plochých souborů je problematické.

Řešení založené na dotazech

Pokud je problém v komponentě, nepoužívejte ji. Na tomto přístupu se mi líbí, že koncepčně je to stejné jako dotazování na tabulku – nezáleží na pořadí sloupců ani na přítomnosti dalších sloupců.

Proměnné

Vytvořil jsem 3 proměnné, všechny typu string:CurrentFileName, InputFolder a Query.

  • InputFolder je pevně připojen ke zdrojové složce. V mém příkladu je to C:\ssisdata\Kipreal
  • CurrentFileName je název souboru. Během návrhu to byl input5columns.csv ale to se změní za běhu.
  • Dotaz je výraz "SELECT col1, col2, col3, col4, col5 FROM " + @[User::CurrentFilename]

Správce připojení

Nastavte připojení ke vstupnímu souboru pomocí ovladače JET OLEDB. Po jeho vytvoření, jak je popsáno v odkazovaném článku, jsem jej přejmenoval na FileOLEDB a nastavil výraz na ConnectionManager na "Data Source=" + @[User::InputFolder] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"text;HDR=Yes;FMT=CSVDelimited;\";"

Řízení toku

Můj tok řízení vypadá jako úloha toku dat vnořená do enumerátoru souborů Foreach

Foreach File Enumerator

Enumerátor My Foreach File je nakonfigurován pro práci se soubory. Vložil jsem do adresáře výraz pro @[User::InputFolder] Všimněte si, že v tomto okamžiku, pokud je potřeba změnit hodnotu této složky, bude správně aktualizována jak ve Správci připojení, tak ve výčtu souborů. V "Načíst název souboru" místo výchozího "Plně kvalifikovaný" vyberte "Název a přípona"

Na kartě Mapování proměnných přiřaďte hodnotu našemu @[User::CurrentFileName] proměnná

V tomto okamžiku každá iterace cyklu změní hodnotu @[User::Query odrážet aktuální název souboru.

Datový tok

Toto je vlastně nejjednodušší kousek. Použijte zdroj OLE DB a připojte jej, jak je uvedeno.

Použijte správce připojení FileOLEDB a změňte režim přístupu k datům na "Příkaz SQL z proměnné." Použijte @[User::Query] klikněte na OK a jste připraveni pracovat.

Ukázková data

Vytvořil jsem dva ukázkové soubory input5columns.csv a input7columns.csv Všechny sloupce z 5 jsou v 7, ale 7 je má v jiném pořadí (sloupec2 je pořadová pozice 2 a 6). Negoval jsem všechny hodnoty v 7, aby bylo snadno zřejmé, se kterým souborem se pracuje.

col1,col3,col2,col5,col4
1,3,2,5,4
1111,3333,2222,5555,4444
11,33,22,55,44
111,333,222,555,444

a

col1,col3,col7,col5,col4,col6,col2
-1111,-3333,-7777,-5555,-4444,-6666,-2222
-111,-333,-777,-555,-444,-666,-222
-1,-3,-7,-5,-4,-6,-2
-11,-33,-77,-55,-44,-666,-222

Výsledkem spuštění balíčku jsou tyto dva snímky obrazovky

Co chybí

Nevím o způsobu, jak říci přístupu založenému na dotazu, že je v pořádku, pokud sloupec neexistuje. Pokud existuje jedinečný klíč, předpokládám, že byste mohli definovat svůj dotaz tak, aby obsahoval pouze sloupce, které musí být u toho a poté provést vyhledávání v souboru, abyste se pokusili získat sloupce, které měli být tam a nepropadnout vyhledávání, pokud sloupec neexistuje. Docela nemotorné.



  1. Jak zabránit poškození databáze v aplikaci Microsoft Access

  2. Jak použít SqlCommand k VYTVOŘENÍ DATABÁZE s parametrizovaným názvem db?

  3. PASS Summit 2013:Úspěch v Charlotte

  4. hodnota je příliš dlouhá pro typ znaku proměnlivé (N)