2011-01-14 11 views
6

Obecnie pracuję nad migracją ze starego serwera bazy danych Advantage do SQL 2005 za pomocą SSIS 2008. Jedna z kolumn w starej bazie Advantage to typ MEMO. Domyślnie przekłada się to na kolumnę DT_TEXT. No cóż, w nowej bazie danych nie potrzebuję tego dużego pola, ale mogę ograniczyć je do czegoś takiego jak VARCHAR (50). I z powodzeniem założyć pochodzący transformację kolumny, aby przekształcić to z następującego wyrażenia:SSIS ISNULL na pusty ciąg

(DT_STR,50,1252)[ColumnName] 

Teraz chcę pójść o krok dalej i zastąpić wszystkie wartości NULL z pustym ciągiem. To wydaje się dość łatwe przy użyciu wyrażenia ISNULL([ColumnName])?"":(DT_STR,50,1252)[ColumnName], ale problemem jest to, że OLE DB Destination zawiera następujący błąd

Nie można konwertować między Unicode i non-unicode ciągi ...

Więc widocznie całe wyrażenie ISNULL konwertuje typ danych na ciąg znaków Unicode [DT-WSTR]. Próbowałem różnych rzutów na całym wyrażeniu lub różnych częściach, ale nie mogę uzyskać typu danych dopasowanego do tego, czego potrzebuję.

Po pierwsze, czy możliwe jest przekonwertowanie typu DT_TEXT bezpośrednio na kod Unicode? Z tego, co wiem, odlewy nie działają w ten sposób. Jeśli nie, czy istnieje sposób, aby wyrażenie działało, aby wartości NULL zostały przekonwertowane na puste łańcuchy?

Dziękuję za całą pomoc!

Odpowiedz

0

Wymyśliłem coś, co działa. To może nie być najlepsze rozwiązanie, ale zadziała w mojej sytuacji.

Z mojego źródła OLE DB najpierw wyprowadziłem kolumnę pochodną. Użyłem ISNULL, który zakończył się konwersją do typu unicode DT_WSTR. chociaż nie mogłem uzyskać żadnych rzutów, aby przywrócić go do wymaganego typu, dodałem transformację konwersji danych między kolumną pochodną i lokalizacją OLE DB. Pobrałoby to ciąg wejściowy i przekształcił go z powrotem w DT_STR. To wszystko wydaje się trochę denerwujące nawracanie tak wiele razy, ale kolumna nie zawiera żadnych funky informacji, które powinienem się martwić, więc myślę, że to zadziała.

Dziękuję wszystkim, którzy zastanawiali się nad rozwiązaniem, a jeśli znajdziesz jakiś świetny sposób, aby rozwiązać ten problem, byłbym bardziej niż zainteresowany.

2

Spróbuj tego w kolumnie wyprowadzonej.

(DT_STR,50,1252) (ISNULL(ColumnName) ? "" : (DT_STR,50,1252) ColumnName) 

Obejmuje dodatkowy typ rzutowania warunkowego (? :) w nawiasach, aby zapewnić pożądaną sekwencję przetwarzania. Myślę, że twoje pierwotne wyrażenie było domyślnie przesyłane do DT_WSTR, ponieważ "" domyślnie jest to DT_WSTR. W nowej wersji wymuszasz rzutowanie na DT_STR po wyliczeniu wyrażenia.

+0

Podjęłam próbę w wielu moich próbach rzucania. Nawet posunąłem się do tego (DT_STR, 50,1252) (ISNULL (ColumnName)? (DT_STR, 1,1252) "" :(DT_STR, 50,1252) ColumnName ... wciąż bez powodzenia. pomysł, i chyba że zrobiłem coś nie tak z moim castingiem, skończyło się nie działa –