所以我目前正在使用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值转换为空字符串?
感谢您的帮助!
答案 0 :(得分:2)
在派生列中试一试。
(DT_STR,50,1252) (ISNULL(ColumnName) ? "" : (DT_STR,50,1252) ColumnName)
它包括一个额外的类型转换,括号中的条件(?:)用于确保所需的处理顺序。我认为你的原始表达式是隐式地转换为DT_WSTR,因为“”默认为DT_WSTR。使用此新版本,在评估表达式后强制转换为DT_STR。
答案 1 :(得分:0)
我想出了一些有用的东西。它可能不是最好的解决方案,但它适用于我的情况。
从我的OLE DB源代码中,我首先做了一个派生列。我使用了ISNULL,最终将其转换为DT_WSTR unicode类型。虽然我无法获得任何强制转换以使其恢复到所需类型,但我在派生列和OLE DB目标之间添加了数据转换转换。这将获取输入字符串并将其转换回DT_STR。这一切都让人觉得有点烦人,但是这个专栏并没有包含任何我应该担心的时髦信息,所以我想它会起作用。
感谢所有思考解决方案的人,如果你找到一些很棒的解决方法,我会更感兴趣。