6

因此,我目前正在使用 SSIS 2008 从旧的 Advantage 数据库服务器迁移到 SQL 2005。旧的 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类型直接转换为unicode?据我所知,演员表不是那样工作的。如果没有,有没有办法让表达式工作,以便将 NULL 值转换为空字符串?

谢谢你的帮助!

4

2 回答 2

2

在您的派生列中尝试一下。

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

它包括一个附加类型转换,括号中带有条件 (?:) 以确保所需的处理顺序。我认为您的原始表达式隐式转换为 DT_WSTR,因为“”默认为 DT_WSTR。使用这个新版本,您可以在计算表达式后强制转换为 DT_STR。

于 2011-01-14T18:23:10.000 回答
0

我想出了一些可行的方法。这可能不是最好的解决方案,但它适用于我的情况。

从我的 OLE DB 源代码中,我首先做了一个派生列。我使用了 ISNULL,最终将其转换为 DT_WSTR unicode 类型。尽管我无法进行任何强制转换以将其恢复为所需的类型,但我随后在派生列和 OLE DB 目标之间添加了一个数据转换转换。这将获取输入字符串并将其转换回 DT_STR。这一切都感觉有点烦人转换这么多次,但该列不包含任何我应该担心的时髦信息,所以我想它会起作用。

感谢所有思考解决方案的人,如果你找到一些很棒的方法来解决它,我会非常感兴趣。

于 2011-01-14T17:38:25.790 回答