SSIS 表达式无法验证

Posted

技术标签:

【中文标题】SSIS 表达式无法验证【英文标题】:SSIS expression fails to validate 【发布时间】:2013-11-20 14:59:38 【问题描述】:

我在 SSIS 派生列组件中设置了以下表达式:

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

但是,这无法验证 - 我收到以下错误:

PKG 错误:对于条件运算符的操作数,数据类型 DT_STR 仅支持输入列和强制转换操作。这 表达式 "TRIM(xCOL) == "" ? (DT_STR,7,1252)xCOL : NULL(DT_STR,7,1252)" 有一个不是输入列的 DT_STR 操作数 或强制转换的结果,不能与条件一起使用 手术。要执行此操作,操作数需要是 使用强制转换运算符显式强制转换。

这里有什么问题?

【问题讨论】:

【参考方案1】:

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)。另请注意,如果您的 xCOL 字段确实为 NULL,这将会崩溃。

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

源数据

SELECT 'Hello' AS xCOL
UNION ALL SELECT ''

结果

【讨论】:

这简直是疯了......我想知道MS是否会做一些事情来使这些表达更加用户友好,因为这样一个简单的表达不应该有这些陷阱。 SSIS 的祸根是对的!为什么不默认为非Unicode【参考方案2】:

正如错误所说,您必须使用强制转换运算符显式强制转换。

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

【讨论】:

微软这个语法有多荒谬?(DT_STR,7,1252)NULL(DT_STR,7,1252) SSIS 语法一直很...傻?但是你看看 Informatica,你把你的 MS 枕头抱得更紧了一点...... 好吧,既然我还没有看过 Informatica,那也许我需要算我的祝福了!

以上是关于SSIS 表达式无法验证的主要内容,如果未能解决你的问题,请参考以下文章

无法解析我的 SSIS 派生列表达式

无法评估表达式。在 SSIS 中(IDTSVa​​riableDispenser100 变量,布尔 isSensitive)

无法在 SSIS 2017 中的 excel 连接管理器上使用表达式

SSIS 优先约束 - 带有 AND 的表达式

SSIS变量表达式 - 转换为字符串

在SSIS包中使用AD服务帐户