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

时间:2010-08-18 19:01:37

标签: tsql casting

我支持将平面文件输入转换为SqlServer数据库表的ETL过程。代码几乎是100%T-SQL并在数据库中运行。我没有代码,也无法更改工作流程。我只能帮助配置获取文件数据并将其转换为表数据的“转换”SQL(稍后将详细介绍)。

现在免责声明已经不在了......

我们的某个文件提供商最近更改了它们代表从'12345.67''12,345.67'的金额的方式。我们转换值的SQL看起来像SELECT FLOOR( CAST([inputValue] AS DECIMAL(24,10))),不再有效。即,逗号打破演员。

鉴于我必须将最终值存储为Decimal (24,10)数据类型(是的,我意识到FLOOR消除了所有小数点后精度 - 设计师与...不同步客户),我该怎么做才能有效地投射这个字符串?'

感谢您的想法。

4 个答案:

答案 0 :(得分:8)

尝试使用REPLACE (Transact-SQL)

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

输出:

12345.67

所以它会是:

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

答案 1 :(得分:2)

虽然对于我的情况不一定是最好的方法,但我想留出一个潜在的解决方案,以便我们在研究这个问题时发现未来的使用。

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

有一点需要注意,MONEY数据类型的精度为4位小数,如果需要,可能需要显式转换才能将其转换为DECIMAL

答案 2 :(得分:1)

这对我有用:

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

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

这可能仅对逗号不是小数分隔符的排序/文化有效(即:西班牙语)

答案 3 :(得分:1)

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