使用逗号分隔符将nVarChar转换为十进制数

问题描述:

我支持将平面文件输入转换为SqlServer数据库表的ETL过程。该代码几乎是100%的T-SQL,并在数据库中运行。我不拥有代码,不能更改工作流程。我只能帮助配置接收文件数据并将其转换为表格数据的“翻译”SQL(稍后会详细介绍)。使用逗号分隔符将nVarChar转换为十进制数

现在的免责声明,都闪开......

我们的一个文件提供者最近改变了他们是如何代表的货币金额从'12345.67''12,345.67'。我们的SQL转换值看起来像SELECT FLOOR(CAST([inputValue] AS DECIMAL(24,10)))并且不再有效。也就是说,这个逗号打破了演员阵容。

考虑到我有终值存储为Decimal (24,10)数据类型(是的,我意识到FLOOR盖过后的小数点精度 - 设计者是不是在与客户同步),我该怎么办有效地投射这个字符串?'

谢谢你的想法。

+0

做了这些答案的任何解决您的问题? – 2010-08-19 13:05:32

+0

@KM:我现在正在与我们的DBA小组讨论这些建议。从我的结尾,提出的常用方法(使用Replace())似乎可行。将尽快更新。 – SethO 2010-08-19 14:16:50

尝试使用REPLACE (Transact-SQL)

SELECT REPLACE('12,345.67',',','') 

OUTPUT:

12345.67 

所以这将是:

SELECT FLOOR(CAST(REPLACE([input value],',','') AS DECIMAL(24,10))) 
+0

+1 ...替换然后铸造,以保留原有的功能。 – Fosco 2010-08-18 19:04:57

这个工作对我来说:

DECLARE @foo NVARCHAR(100) 
SET @foo='12,345.67' 

SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10))) 

这可能是唯一有效的排序规则/文化中的逗号不是小数点分隔符(即:西班牙)

+0

你提出了一个很好的观点,David。我知道一些输入来自欧洲和亚洲 - 这可能会使用逗号将任何字符串操作混淆为空字符串。我将不得不跟进客户。 – SethO 2010-08-18 19:09:07

+0

最好让您的应用程序检测用户的语言环境,转换为类型化的十进制数,然后将其作为键入的十进制值传递到sql服务器。问题消失。 – David 2010-08-18 19:13:47

SELECT FLOOR (CAST(REPLACE([inputValue], ',', '') AS DECIMAL(24,10)))

虽然不一定适合我的情况,最好的方法,我想离开一个潜在的解决方案以供我们在研究此问题时发现的未来使用。

看起来,SqlServer数据类型MONEY可以用作字符串的直接转换,用逗号分隔非小数部分。所以,SELECT CAST('12,345.56' AS DECIMAL(24,10))失败,SELECT CAST('12,345.56' AS MONEY)将成功。

需要注意的是,MONEY数据类型的精度为4位小数,如果需要的话,需要进行明确的转换才能将其转换为DECIMAL