Konwertowanie ciągów innych niż Unicode na ciągi Unicode SSIS

9

Tworzę pakiet, w którym będę eksportować dane z bazy danych do pustego pliku programu Excel. Kiedy dodałem tylko komponenty źródłowy i docelowy i uruchomiłem pakiet, wystąpił błąd konwersji informujący, że kolumna wyjściowa i kolumna „A” nie mogą konwertować między typami danych unicode i nie-Unicode.

Aby to naprawić, dodałem komponent konwersji danych i przekonwertowałem wszystkie kolumny

„Ciąg Unicode [DT_WSTR]”

i nie otrzymałem już błędu. Jedynym problemem jest to, że miałem około 50 kolumn, w których musiałem iść 1 na 1 i wybrać „Unicode String [DT_WSTR]” z rozwijanej listy. Następnie musiałem przejść do komponentu docelowego i zamapować nowo przekonwertowane kolumny na mój plik Excel.

Moje pytanie brzmi: czy ktokolwiek zetknął się z tym, czy istnieje lepszy i bardziej skuteczny sposób na obejście wszystkich ręcznych konwersji typów danych? Konwertowanie i mapowanie wszystkich kolumn jeden po drugim nie wydaje się praktyczne, zwłaszcza jeśli masz dużą liczbę wierszy.

Rozumiem, że pliki Excela nie są najlepszym sposobem na importowanie i eksportowanie danych, ale jest to wymagane w tym konkretnym przypadku.

Mogę poszukać sposobu na wyeksportowanie do płaskiego pliku tekstowego, a następnie spróbować przekonwertować go do programu Excel jako ostatni krok w pakiecie. Mam nadzieję, że to nie spowoduje tego samego błędu konwersji unicode / nonunicode.

Juan Velez
źródło
jak potem syndrom cieśni nadgarstka? :-)
Patrick Honorez,
Upewnij się, że tabela, do której przenosisz dane, używa typów danych Unicode (tj .: nvarchar (50) zamiast varchar (50))
MacGyver

Odpowiedzi:

15

Jako alternatywę dla RDC po prostu pominąłem konwersję typów danych w SSIS i jawnie przekazałem je jako nvarchar w moim zapytaniu źródłowym.

Stosowanie

W zapytaniu źródłowym (i przy użyciu kwerendy źródłowej a nie po prostu wybierając tabelę w dół doliny), wyraźnie rzucać rzeczy do odpowiedniego n (VAR) długości char.

Zamiast

SELECT
    E.BusinessEntityID
,   E.NationalIDNumber
,   E.LoginID
,   E.JobTitle
,   E.BirthDate
,   E.MaritalStatus
,   E.Gender
FROM
    HumanResources.Employee AS E

użyj zapytania takiego jak

SELECT
    CAST(E.BusinessEntityID AS nvarchar(10)) AS BusinessEntityID
,   CAST(E.NationalIDNumber AS nvarchar(15)) AS NationalIDNumber
,   CAST(E.LoginID AS nvarchar(256)) AS LoginID
,   CAST(E.JobTitle AS nvarchar(50)) AS JobTitle
,   CAST(E.BirthDate AS nvarchar(10)) AS BirthDate
,   CAST(E.MaritalStatus AS nchar(1)) AS MaritalStatus
,   CAST(E.Gender AS nchar(1)) AS Gender
FROM
    HumanResources.Employee AS E

Sprytni studenci AdventureWorks rozpoznają, że dane były już n(var)chartypem, ale miało to jedynie na celu zademonstrowanie tej koncepcji.

Korzyści

  • Zużyte mniej pamięci. Obecnie przydzielanie i przechowywanie dwóch kopii „tych samych” danych Data Conversion Componentodbywa się za pomocą SSIS
  • Bez RSI . Nie trzeba klikać N razy i podawać wszystkich tych informacji w okropnym małym edytorze, który zapewniają. Użyłbym zapytania przeciwko scenie dmv / information_schema, aby dodatkowo zautomatyzować generowanie eksportu tabeli „Excel ready”.
  • Brak instalacji niestandardowego komponentu. Pracowałem w miejscach, w których instalowanie oprogramowania typu open source było dosłowne. Instalowanie aplikacji innych firm wiąże się również z odroczonym czasem konserwacji, ponieważ teraz „wszyscy” muszą zainstalować tę samą aplikację, aby zachować kod, i musi zostać zainstalowany na serwerach, a firma infosec musi zbadać zestawy, aby upewnić się, że są prawidłowe i potrzebujemy podpisów od bajillionów ludzi, którzy przewyższają cię ...
billinkc
źródło
1
„Jako alternatywa dla RDC” - Co to jest RDC? Kiedy czytam następną odpowiedź, myślę, że możesz mieć na myśli Zastąpienie komponentu danych, ale ponieważ autor oryginalnego postu nie wspomniał o tym komponencie, może być za wcześnie na akronim. :-)
Thronk,
mówiąc o RSI, CONVERTpowinno być łatwiej wkleić 50 razy niż CAST, ponieważ argumenty są przed sobą
Patrick Honorez
2

Jeśli musisz zmienić tylko „Ciąg Unicode (DT_WSTR)” na „Ciąg (DT_STR)” lub odwrotnie, możesz to zrobić:

  1. Zapisz kopię pliku package.dtsx- (na wypadek konieczności odzyskania)
  2. Otwórz pakiet.dtsx w edytorze lub w MS Visual Studio, kliknij pakiet prawym przyciskiem myszy i wybierz „Wyświetl kod”. Zobaczysz plik XML.

Wyszukaj ciąg, DTS:DataTypejeśli następuje po nim = „130”, a następnie Kolumna jest zdefiniowana jako DT_WSTR (Unicode).

Jeśli po niej następuje = "129", to Kolumna jest zdefiniowana jako DT_STR (nie-Unicode), użyj wyszukiwania i zamień ostrożnie (wcześniej zrobiłeś kopię, prawda?)

Zapisz plik i być może to było to.

Cjonas
źródło
1
Witamy w DBA SE! Pro wskazówka: strona ma różne funkcje formatowania tekstu, aby Twoje posty były lepiej wyglądające. Użyj ikon w górnej części pola tekstowego edytora.
Peter - Przywróć Monikę