Jak poradzić sobie z nieodpowiednim mapowaniem typu kolumny w SSIS podczas importu plików XLS?
SQL Server posiada usługi integracyjne (SSIS), które służą między innymi do importu danych. Jednym z możliwych źródeł takiego importu może być plik Excela.
W momencie gdy kreujemy paczkę importową za pomocą BIDS i serwer podłącza się do wybranego pliku to zostają zamapowane typy kolumn.
Ponieważ wyboru typów jest używanych pierwszych osiem wierszy pliku XLS i odpowiada za to sterownik Excela, to nie możemy tych typów zmienić na inne, bardziej odpowiednie.
Problem ten jest o tyle dotkliwy, że podczas importu SSIS nie zwraca błędu, a wszystkie niepasujące wartości są zaimportowane jako NULL.
Przykład tego typu problemu można znaleźć pod adresem:
http://support.microsoft.com/kb/236605
Pierwszym możliwym obejściem tego jest zmiana wartości TypeGuessRows w następującej gałęzi rejestru:
HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel
na liczbę większą od 8 lub równą zeru (dla zera przy wyborze kolumny będą brane pod uwagę wszystkie wiersze).
Drugą możliwością jest edycja paczki SSIS poprzez Business Inteligence Development Studio oraz zmiana właściwości ConnectionString dla ExcelConnectionManager, a dokładniej dodanie wpisu: IMEX=1 w sekcji Extended Properties.
Przykład zmienionego Conncction String-a podaje poniżej:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Documents and Settings\Czarek\Moje dokumenty\ImportHEX.xls;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1";
Wpis ten mówi Excelowi aby w przypadku gdy w danej kolumnie występują wartości nvarchar, to cała kolumna ma przyjąć ten typ.
Po zmianie tego wpisu niestety trzeba będzie na nowo utworzyć Excel Source, gdyż to w nim jest zawarta definicja kolumn.
Czasem zastosować oba podejścia na raz, gdyż w przypadku zmiany TypeGuessRows Excel nie zawsze rzutuje odpowiednio typy. Gdy natomiast zmienimy tylko IMEX to istnieje możliwość, że wartości w pierwszych ośmiu wierszach będą typu integer, a w kolejnych typu varchar. Ponieważ Do wybrania typu kolumny będą brane tylko te pierwsze - opcja IMEX nie będzie miała szansy zadziałać.