2

我有一个源平面文件,其值如 24.209991,但它们需要作为 money 类型加载到 SQL Server。在 DTS(我从中转换)中,该值为 24.21。如何在 SSIS 中转换该字段?

现在,我只是将类型从 DT_STR 更改为 DT_CY,它给出了“数据转换失败”的运行错误。列“Col003”的数据转换返回状态值 2 和状态文本“由于可能丢失数据,无法转换该值。”。

我是否使用数据转换任务?然后什么?

我还尝试将源输出列设置为 DT_NUMERIC,然后将其转换为 DT_CY,结果相同。

我也尝试过使用派生列,将 DT_STR 字段 Col003 转换为 (DT_NUMERIC,10,2)Col003,然后将其转换为 (DT_CY)Col003_Numeric。这是一个演员错误。

4

3 回答 3

2

平面文件默认所有字段为 DT_STR。使用编辑连接的高级选项将数字字段设置为浮点数 (DT_R4)。然后,在 Flat File Source 的高级编辑中(在 Data Flow 选项卡上),将该输出列设置为 money (DT_CY)。

然后,该字段将在没有任何额外转换的情况下进行转换。问题是将源文件定义保留为 DT_STR。

于 2012-01-27T23:32:34.287 回答
1

如果您没有任何空值,请使用数据转换,并确保您没有任何有趣的字符(例如 US$200 产生错误)

如果您的字段中有空字段或空字段并且您使用的是平面文件源,请确保勾选“从源返回空值..”

我使用的另一个技巧是:(taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)).在派生列转换中(您可以只替换字段)

通常 SSIS 不会正确地将空字符串转换为货币。

于 2012-01-23T21:28:09.223 回答
1

出于某种原因,在我的场景中,OLE DB Destination实际配置接受DT_CY. 但是,转换为这种格式(无论输入和目标数据的长度如何,也无论数据NULL到达时是否存在)总是会导致相同的问题。

添加数据查看器后,我可以得出结论,这与语言环境有关。在丹麦,我们使用逗号 ( ,) 作为十进制分隔符,使用点 ( .) 作为千位分隔符,而不是相反。

这意味着一个巨大的数字382,939,291,293.38(在转换为 之后DT_CY)看起来像382.939.291.293,38。尽管我非常怀疑这可能是问题所在,但我还是决定做与我最初打算相反的事情。

我决定转到我的高级设置OLE DB Destination并将DT_CY列的类型更改为DT_STR。然后,我添加了一个转换,并在数据到达目的地之前Derived Column输入以下表达式来转换列。

REPLACE(SUBSTRING(Price, 2, 18), ",", ".")Price列的名称在哪里。

令我大吃一惊的是,这解决了问题,因为我发现我OLE DB Destination现在正在将数据作为字符串发送,SQL Server 完全可以理解。

我确定这是一个错误!我使用的是 SQL Server 2008,所以它可能在以后的版本中得到了解决。但是,我发现这样一个重要的东西不能正常工作是非常关键的!

于 2013-08-19T14:23:02.293 回答