SSIS: Dynamiczna nazwa pliku podczas eksportu danych

30-Gru-2014

Załóżmy, że chcesz eksportować dane do excela, ale za każdym razem ma powstawać plik z nową nazwą. Nazwa może wynikać np z wartości parametru generowanego podczas pętli (patrz poprzedni wpis).

Samo przepisywanie danych ze źródła do celu to nic. Umieszczasz w Data Flow Tasku Data Source wskazujące np na SQL Server, definiujące zapytanie pobierające dane z SQL. Umieszczasz też excel destination. Podczas edytowania excel destinantion musisz podać nazwę pliku. Ta nazwa pliku potrzebna jest na czas developmentu paczki. Podczas uruchomienia będzie w locie zamieniana na inną wartość.

Jak zmienić tę stałą nazwę pliku? Podczas tworzenia Excel destination musiałeś zdefiniować Excel connection managera. Kliknij na nim i w okienku właściwości poszukaj wałaściwości Expressions:

excel_01

Posługując się przyciskiem […] oraz listą rozwijaną wskaż na zmienną, która decyduje o nazwie pliku. W moim przypadku była to zmienna FileName zdefiniowana na poziomie pakietu poprzez wyrażenie budujące nazwę pliku z nazwy użytkownika i wybranego okresu:

excel_02

 

Niestety podczas uurchamiania pakietu nadal dostawałem bład:

Error at Data Flow Task [Excel Destination [497]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E37.
Error at Data Flow Task [Excel Destination [497]]: Opening a rowset for „Excel_Destination$” failed. Check that the object exists in the database.
Error at Data Flow Task [SSIS.Pipeline]: „component „Excel Destination” (497)” failed validation and returned validation status „VS_ISBROKEN”.
Error at Data Flow Task [SSIS.Pipeline]: One or more component failed validation.
Error at Data Flow Task: There were errors during task validation.

Głupia sprawa. Excel podczas eksportu nie utworzy sam pliku. Wymaga, aby taki plik już wcześniej istniał na dysku!

Przypomnij sobie moment tworzenia Excel destination. W tym procesie utworzyłeś Skoroszy i wybrałeś/utworzyłeś arkusz. Plik o takiej właśnie strukturze musi się już wcześniej znajdować na dysku! trudna rada, trzeba więc go skopiować. Można to zrobić korzystając z filesystem task:

excel_03

 

Należy tylko odpowiednio zdefiniować jego właściwości. W moim przypadku nazwa pliku docelowego jest zmienną User::FileName, plik należy skopiować. Oryginalny plik jest zakodowany na stałe i wskazuje na niego SourceConnection.

 

excel_04

 

Podsumowując: Pakiet SSIS:

  • Określi nazwę pliku w zmiennej User::FileName
  • Skopiuje oryginalnie utworzony podczas budowania pakietu plik pod nazwę User::FileName
  • Uruchomi eksport danych przepisujący dane z SQL do pliku Excel, którego Connection Manager określa ścieżkę do pliku używając tej samej zmiennej.

Cóż skomplikowane. Mogłoby być łatwiejsze. Może w następnej wersji….

Dodaj komentarz:

Autor: Rafał Kraik