2013-11-20 8 views
3

я установил следующее выражение в SSIS производного компонента колонки:выражение SSIS не подтверждает

TRIM(xCOL) == "" ? (DT_STR,7,1252)xCOL : NULL(DT_STR,7,1252) 

Однако это не подтверждает - я получаю следующее сообщение об ошибке:

Error at PKG: For operands of the conditional operator, the data type DT_STR is supported only for input columns and cast operations. The expression "TRIM(xCOL) == "" ? (DT_STR,7,1252)xCOL : NULL(DT_STR,7,1252)" has a DT_STR operand that is not an input column or the result of a cast, and cannot be used with the conditional operation. To perform this operation, the operand needs to be explicitly cast with a cast operator.

Что случилось Вот?

ответ

6

Unicode - проклятие всех вещей SSIS, которые вы считаете бы просто работающими.

TRIM(xCOL) == "" ? (DT_STR,7,1252)xCOL : NULL(DT_WSTR, 7)

По умолчанию выражения в строках имеют тип возврата Unicode (DT_WSTR). Вы можете это доказать самостоятельно, заменив последнее выражение пустой строкой "". Посмотрите на тип, производный столбец назначенная как - это DT_WSTR

TRIM(xCOL) == "" ? (DT_STR,7,1252)xCOL : "" 

Разрешение является то, чтобы привести результат всего выражениядо нужного типа. (Я также думаю, что у вас есть логическая проблема, так как я предполагаю, что вы проверяете обрезанную строку, чтобы определить, является ли она пустой/нулевой длиной, а затем отбрасывает ее в NULL). Также обратите внимание, что если вы когда-либо получите NULL в поле xCOL, это взорвется.

(DT_STR, 7, 1252)((TRIM(xCOL) == "") ? NULL(DT_WSTR, 7) : TRIM(xCOL)) 

Источник данных

SELECT 'Hello' AS xCOL 
UNION ALL SELECT '' 

Результаты

enter image description here

+0

Это просто безумие ... Интересно, будет ли MS делать что-то, чтобы сделать эти выражения более удобными для пользователя, потому что такое простое выражение не должно иметь таких подводных камней. – kyooryu

+0

Проклятье всех вещей SSIS правильно! почему не по умолчанию не-Unicode –

4

Как и в случае ошибки, вы должны явно использовать оператор литья.

TRIM(xCOL) == "" ? (DT_STR,7,1252)xCOL : (DT_STR,7,1252)NULL(DT_STR,7,1252) 
+0

И как смешно является этот синтаксис, Microsoft? '(DT_STR, 7,1252) NULL (DT_STR, 7,1252) ' –

+0

Синтаксис SSIS всегда был ... глупым? Но тогда вы смотрите на Informatica, и вы обнимаете свою подушку MS немного туже ... –

+0

Ну, так как я не видел Informatica, то, возможно, мне нужно сосчитать мои благословения! –

Смежные вопросы