在SQL Server资金列中,我如何处理来自国家特定Excel文件的不同货币符号通过SSIS(在varchar中转换为货币),处理逗号和点表示以确保值保持正确?
例如,如果这些是Excel中的三个列值:
22,333.44
22.333,44
22333,44
上面的第一个符号将导致22,3334,这当然是不正确的。
我需要对数据做些什么?它是字符串替换还是更优雅的东西?
谢谢。答案 0 :(得分:2)
<强>更新:强> 在评论中讨论后,问题已得到澄清。 excel列中的值可以是许多不同的区域格式(英语使用逗号分隔数千,'。'代表小数点,德语使用'。'代表千分,逗号代表小数点。)
假设目标格式是英语,并且您没有附带的列来指示格式,那么您将不得不实施一种变通方法。如果你可以保证在“小数位”(德语格式的逗号)之后总会有2个数字,那么REPLACE(REPLACE(@ Value,',',''),'。','')将摆脱每一个逗号/点。然后,您必须获取生成的varchar的长度,并在最后2个字符之前手动插入小数(或逗号)。这是一个示例实现:
declare @number varchar(12),@trimmednumber varchar(12),@inserteddecimal varchar(12)
set @number='22.333,44'
select @trimmednumber=REPLACE(REPLACE(@number,',',''),'.','')
select @inserteddecimal=(LEFT(@trimmednumber,len(@trimmednumber)-2) + '.' + RIGHT(@trimmednumber,2))
select @number AS [Original],@trimmednumber AS [Trimmed],@inserteddecimal AS [Result]
结果:
Original Trimmed Result
------------ ------------ ------------
22.333,44 2233344 22333.44
原始答案:
我可能误解了你的问题,但是如果你将这些值作为VARCHAR接收并将它们插入到MONEY列中,则隐式转换应该是正确的。
以下是我共同测试的内容:
declare @money_varchar1 varchar(12),@money_varchar2 varchar(12),@money_varchar3 varchar(12)
set @money_varchar1='22,333.44'
set @money_varchar2='22.333,44'
set @money_varchar3='22333,22'
declare @table table (Value money)
insert into @table values (@money_varchar1)
insert into @table values (@money_varchar2)
insert into @table values (@money_varchar3)
select * from @table
结果:
Value
---------------------
22333.44
22.3334
2233322.00