【问题标题】:SSIS cast to DT_WSTR not casting, or so it seemsSSIS 转换为 DT_WSTR 不转换,或者看起来
【发布时间】:2011-12-19 14:25:47
【问题描述】:

我正在创建一个 SSIS 2008 包,它从 ASCII 平面文件源读取数据并将其写入 SQL Server 2008 数据库。 BIDS 抱怨 unicode 和非 unicode 数据类型之间的隐式转换,因此我使用派生列工具进行转换。这是它的样子:

Derived Column Name  |  Derived Column  |  Expression          |  Data Type
AccountName2         |  Replace 'AName' | (DT_WSTR,100) AName  |  string [DT_STR]

我仍然遇到同样的错误:

Validation error. InsertAccountRecords: InsertAccountRecords: Columns "AccountName2" and "AName" cannot convert between unicode and non-unicode string data types.

错误出现在 SQL Server 目标中,这让我相信问题出在派生列中的数据类型上。我将它从 DT_STR 转换为 DT_WSTR,但根据这个,数据类型仍然名义上是 DT_STR,不是吗?

我在 Google 上四处搜索,但似乎找不到这个问题的任何好的答案。任何人都可以提供任何指导吗?

编辑:是的。查看派生列下游的数据查看器,AccountName2 仍然显示为 DT_STR。为什么没有演员阵容?

【问题讨论】:

    标签: casting ssis


    【解决方案1】:

    documentation 指出,只有当您选择添加新列时,新数据类型才会正确设置。您需要在派生列下拉菜单中选择“添加为新列”。

    或者只使用数据转换转换,如果更改数据类型是您正在进行的唯一转换,这可能会更容易。

    【讨论】:

    • 是的。这是 100% 的情况,添加数据转换转换让事情变得更加简单。
    • 不过,我还是想知道,为什么,为什么,为什么!?为什么他们应该选择不在替换时正确设置数据类型...?
    • @igorludi 我不知道,但是 SSIS 在处理数据类型方面非常保守,例如不允许隐式转换。所以我的猜测是设计决定是单个列不能在包的不同位置具有不同的数据类型。这将避免包突然中断的问题,因为有人添加了新的数据类型转换并且不更新“下游”逻辑:通过使用新列,您必须更新整个包。它可能会使一些元数据操作(如血统分析)更容易。但我没有这个猜测的证据。
    • 好的,看起来很合理。不过有一件事,我不太确定隐式转换。例如,我设置了两个数据流,使用:AdoNet->AdoNet OledDb->OleDb,对 src 和 dest 使用相同的数据库(和表)。前者自动将非 unicode 转换为 unicode 字符串,后者导致错误(这就是我来到这里的原因:))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2020-11-06
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多