我支持将平面文件输入转换为SqlServer数据库表的ETL过程。代码几乎是100%T-SQL并在数据库中运行。我没有代码,也无法更改工作流程。我只能帮助配置获取文件数据并将其转换为表数据的“转换”SQL(稍后将详细介绍)。
现在免责声明已经不在了......
我们的某个文件提供商最近更改了它们代表从'12345.67'
到'12,345.67'
的金额的方式。我们转换值的SQL看起来像SELECT FLOOR( CAST([inputValue] AS DECIMAL(24,10)))
,不再有效。即,逗号打破演员。
鉴于我必须将最终值存储为Decimal (24,10)
数据类型(是的,我意识到FLOOR
消除了所有小数点后精度 - 设计师与...不同步客户),我该怎么做才能有效地投射这个字符串?'
感谢您的想法。
答案 0 :(得分:8)
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)))