SSIS ISNULL для пустой строки
Поэтому в настоящее время я работаю над миграцией со старого сервера базы данных Advantage на SQL 2005 с использованием SSIS 2008. Один из столбцов в старой базе данных Advantage имеет тип MEMO. По умолчанию это переводится в столбец DT_TEXT. Что ж, в новой базе данных мне не нужно это большое поле, но я могу ограничить его чем-то вроде VARCHAR(50). Я успешно настроил преобразование производного столбца, чтобы преобразовать его следующим выражением:
(DT_STR,50,1252)[ColumnName]
Теперь я хочу пойти дальше и заменить все значения NULL пустой строкой. Это может показаться достаточно простым, используя ISNULL([ColumnName])?"":(DT_STR,50,1252)[ColumnName]
выражением, но проблема в том, что назначение OLE DB содержит следующую ошибку
Невозможно выполнить преобразование между строками Unicode и не Unicode...
Таким образом, очевидно, что все выражение ISNULL преобразует тип данных в строку Unicode [DT-WSTR]. Я пробовал разные типы целого выражения или разных частей, но я не могу получить тип данных, который бы соответствовал тому, что мне нужно.
Во-первых, возможно ли преобразовать тип DT_TEXT напрямую в Юникод? Из того, что я могу сказать, слепки не работают таким образом. Если нет, есть ли способ заставить выражение работать так, чтобы значения NULL преобразовывались в пустые строки?
Спасибо за твою помощь!
2 ответа
Я понял что-то, что работает. Возможно, это не лучшее решение, но оно подойдет для моей ситуации.
Из моего источника OLE DB я сначала сделал производную колонку. Для этого я использовал ISNULL, который в итоге преобразовал его в тип Unicode DT_WSTR. хотя я не мог получить приведения, чтобы вернуть его к требуемому типу, я затем добавил преобразование преобразования данных между производным столбцом и назначением OLE DB. Это взяло бы входную строку и преобразовало бы ее обратно в DT_STR. Все это немного раздражает при конвертации, но столбец не содержит какой-либо интересной информации, о которой мне следует беспокоиться, поэтому я полагаю, что это сработает.
Спасибо всем, кто обдумал решение, и если вы найдете какой-то отличный способ решить его, я буду более чем заинтересован.
Попробуйте в своей производной колонке.
(DT_STR,50,1252) (ISNULL(ColumnName) ? "" : (DT_STR,50,1252) ColumnName)
Он включает дополнительный тип приведения с условным (?:) в скобках, чтобы обеспечить желаемую последовательность обработки. Я думаю, что ваше оригинальное выражение было неявно приведено к DT_WSTR, потому что "" по умолчанию - DT_WSTR. В этой новой версии вы приводите приведение к DT_STR после вычисления выражения.