【问题标题】:SSIS / SQL Server - dealing with various money type notationsSSIS / SQL Server - 处理各种货币类型符号
【发布时间】:2012-09-04 03:48:13
【问题描述】:

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

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

22,333.44

22.333,44

22333,44

上面的第一个符号会得到 22,3334,这当然是不正确的。

我需要如何处理这些数据?是字符串替换还是更优雅的东西?

谢谢。

【问题讨论】:

    标签: sql sql-server excel ssis type-conversion


    【解决方案1】:

    更新: 在 cmets 讨论后,问题已得到澄清。 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
    

    【讨论】:

    • 好的,你误解了我的问题或者我误解了你的例子:-)我的意思是你的例子中的值都是不同的,而实际上数字是相同的(22000)值-明智的,不应该被解释为 22 美元(这就是我阅读第二个输出行的方式)。
    • 您提供的值都不同。当您说它们相同(22,000)时,它们在哪里/如何相同?您提供的 3 个 excel 值都是不同的值。如果您说您需要忽略任何逗号或小数点,那么您可以使用 REPLACE(@Value,',','') 手动删除它们,然后将所有这些删除的结果插入到您的数据库中。但是我很好奇,如果您要忽略它们,为什么逗号和小数会首先出现?
    • 由于格式/符号标准不同,它们是相同的。看看这个:** US Format - 1,234,567.89** ** German Format - 1.234.567,89** 相同的值但不同的分隔符。
    • 现在我明白了。您需要定义一个标准格式并遵守它。在同一列中使用不同的格式类型,如果您没有关联的列详细说明值所在的格式,那么您将不得不实施各种解决方法。我会用一种方法更新上面的答案。
    • 如果你的函数找到最后一个逗号或点并且这个字符是十进制分隔符,而不是最后两个字符,可能更好的解决方案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2023-03-25
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多