2012-01-16 417 views
1

我有一个源平面文件,其值为24.209991,但它们需要以类型金钱的形式加载到SQL Server。在DTS(我正在转换)中,该值为24.21。如何在SSIS中转换该字段?SSIS如何将字符串(DT_STR)转换为金钱(DT_CY)当源数据超过2位时

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

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

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

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

+0

您使用的是ADO.NET目标吗?我刚刚尝试了一个OLE DB目标,并没有问题。 – Eric 2012-01-16 21:26:14

+0

平面文件源,OLE DB目标。没有问题,是吧?我究竟做错了什么?! – thursdaysgeek 2012-01-16 21:38:39

回答

0

平面文件默认为所有字段为DT_STR。在编辑连接时使用高级选项将数字字段设置为float(DT_R4)。然后,在平面文件源的高级编辑中(在数据流选项卡上),将该输出列设置为金钱(DT_CY)。

然后,该字段将转换,无需任何额外的转换。问题是将源文件定义保留为DT_STR。

1

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

如果你在你的领域空或空字段和您使用平面文件源,确保您勾选“从源代码返回空值。”

我已经使用的另一个技巧是一样的东西:(taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)).在派生列转换(只需更换现场)

一般SSIS不会将空字符串正确转换为金钱。

0

出于某种原因在我的情况下,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,所以它可能已经在以后的版本中得到解决。但是,我发现这种重要的事情不能正常工作是非常重要的!

相关问题