【问题标题】:Can't convert DT_NTEXT to NUMCERIC using SSIS无法使用 SSIS 将 DT_NTEXT 转换为 NUMCERIC
【发布时间】:2021-05-17 18:09:50
【问题描述】:

我们通过 Power Query 从 Web 加载 CSV。在其他列中,有三个数据类型为 DT_NTEXT 的货币列作为输出列。我已经尝试使用数据转换任务作为第一件事,将列转换为 DT_WSTR(4000),然后在下面的派生列任务中使用以下表达式将它们转换为 numeric(17,5):

TRIM(price_conv) == "" ? NULL(DT_NUMERIC,17,5) : ((DT_NUMERIC,17,5)TRIM(price_conv))

不幸的是,这仍然失败。

错误信息:

[派生列 [2]] 错误:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “派生列”失败,因为发生错误代码 0xC0049063,并且“派生列.输出 [派生列的输出].列 [价格派生]”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

[SSIS.Pipeline] 错误:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。处理输入“派生列的输入”(3) 时,组件“派生列”(2) 上的 ProcessInput 方法失败,错误代码为 0xC0209029。已识别的组件从 ProcessInput 方法返回错误。该错误是特定于组件的,但该错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

PS:错误消息部分翻译自德语。

我也尝试在 Power Query 源的高级编辑器中设置 DT_WSTR,但也失败了。

有人有想法吗?

【问题讨论】:

  • 如果将几个派生列任务链接在一起会发生什么? DT_NTEXT 到 DT_WSTR(4000)。将 dt_wstr 转换为数字的派生列,但在 DT_WSTR 的输出之间和 DT_NUMERIC 之前添加数据查看器。数据在这里看起来合适吗?有空值吗?本地化怎么样 - 鉴于您的错误消息是从德语翻译的,我不知道转换是否会期望字符串为“123,45”或“123.45”,即使句点是 DE 的千位分隔符
  • 谢谢。的提示。并且,分隔符是金色的。表达式:TRIM(origprice_conv) == "" ? NULL(DT_NUMERIC,17,5) : ((DT_NUMERIC,17,5)REPLACE(TRIM(origprice_conv),".",",")) origprice_conv 已经转换为 DT_WSTR。

标签: sql ssis


【解决方案1】:

我不得不对分隔符(. 和 ,)使用替换功能,然后它就起作用了。

#1 使用数据转换任务或在派生列任务中转换为DT_WSTR

#2 注意分隔符,必要时用replace函数替换

例子:

TRIM(origprice_conv) == "" ? NULL(DT_NUMERIC,17,5) : ((DT_NUMERIC,17,5)REPLACE(TRIM(origprice_conv),".",",")) 

origprice_conv 已转换为 DT_WSTR。

很遗憾SSIS在这里没有给出有意义的错误信息。

我的问题有两个,但数据查看器帮助确定了问题。第一个是我可以为origprice_conv 设置空白值,而默认转换不起作用。我通过将 null 转换为正确的 DT_NUMERIC 规范来解决这个问题。第二个问题是源数据在数据中使用了美式小数位。在德国,转换预期字符串为“123,45”而不是“123.45”。国际化说明,句点是德国的千位分隔符。

【讨论】:

    【解决方案2】:

    问题是没有从ntext到numeric的隐式或显式转换,参考:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15

    修剪首先会失败,因此您可能需要做的是,如 billinkc 建议的那样,进行双重转换,先转换为 wstr、修剪,然后再转换为数字:

    (DT_NUMERIC,17,5)TRIM((DT_WSTR,20)(price_conv))
    

    【讨论】:

    • 我已经试过了。错误是现在描述的分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多