2

在 SQL Server 货币列中,如何处理通过 SSIS(在 varchar 中 - 转换为货币)从国家特定的 Excel 文件传入的不同货币符号,处理逗号和点表示以确保值保持正确?

例如,如果这些是 Excel 中的三列值:

22,333.44

22.333,44

22333,44

上面的第一个符号将导致 22,3334,这当然是不正确的。

我需要对数据做什么?它是字符串替换还是更优雅的东西?

谢谢你。

4

1 回答 1

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
于 2012-09-11T08:52:28.810 回答