SSIS/SQL Server-处理各种货币类型符号

SSIS/SQL Server-处理各种货币类型符号,sql,sql-server,excel,ssis,type-conversion,Sql,Sql Server,Excel,Ssis,Type Conversion,在SQL Server货币专栏中,如何处理通过SSI(在varchar中-转换为货币)从特定于国家/地区的Excel文件中输入的不同货币符号,注意逗号和点表示以确保值保持正确 例如,如果Excel中有三列值: 22333.44 22.333,44 22333,44 上面的第一个符号将导致223334,这当然是不正确的 我需要如何处理这些数据?这是一个字符串替换还是更优雅的东西 谢谢。更新: 在评论中讨论后,问题已得到澄清。excel列中的值可以是多种不同的区域格式(英语使用逗号分隔千,小数点使用

在SQL Server货币专栏中,如何处理通过SSI(在varchar中-转换为货币)从特定于国家/地区的Excel文件中输入的不同货币符号,注意逗号和点表示以确保值保持正确

例如,如果Excel中有三列值:

22333.44

22.333,44

22333,44

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

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

谢谢。

更新: 在评论中讨论后,问题已得到澄清。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
Value
---------------------
22333.44
22.3334
2233322.00
原始答案:

我可能误解了您的问题,但是如果您将这些值作为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
结果是:

Original     Trimmed      Result
------------ ------------ ------------
22.333,44    2233344      22333.44
Value
---------------------
22333.44
22.3334
2233322.00

好吧,你误解了我的问题,或者我误解了你的例子:-)我的意思是,你例子中的值都是不同的,而实际上数字是相同的(两万两千)值,不应该被解释为二十二美元(这是我读第二行的方式)例如,您提供的值都不同。当你说他们是一样的(22000),他们在哪里/如何是一样的?您提供的3个excel值都是不同的值。如果您说需要忽略任何逗号或小数点,则可以使用REPLACE(@Value,“,”,“”)手动删除它们,然后将删除的所有逗号或小数点的结果插入数据库。但我很好奇,如果你忽略它们,为什么逗号和小数会出现在第一位?它们是一样的,因为不同的格式/符号标准。看看这个:*美国格式-1234567.89****德国格式-1.234.567,89**相同的值但不同的分隔符。现在我知道了。您需要定义一个标准格式并遵守它。对于同一列中的不同格式类型,如果没有相关列详细说明值所采用的格式,则必须实施一系列解决方法。我将用一种方法更新上面的答案。如果你的函数找到最后一个逗号或点,并且这个字符是十进制分隔符,而不是最后两个字符,可能会是更好的解决方案。。。