代码之家  ›  专栏  ›  技术社区  ›  SethO

将带逗号分隔符的nvarchar转换/转换为十进制

  •  7
  • SethO  · 技术社区  · 14 年前

    我支持将平面文件输入转换为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 回复  |  直到 14 年前
        1
  •  8
  •   KM.    14 年前

    试用使用 REPLACE (Transact-SQL) :

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

    输出:

    12345.67
    

    所以:

    SELECT FLOOR( CAST(REPLACE([input value],',','') AS DECIMAL(24,10)))
    
        2
  •  2
  •   SethO    14 年前

    虽然不一定是解决我的情况的最佳方法,但我想留下一个潜在的解决方案,供我们在研究这个问题时发现的将来使用。

    似乎sqlserver数据类型 MONEY 可以用作字符串的直接强制转换,其中逗号分隔非小数部分。所以,在哪里 SELECT CAST('12,345.56' AS DECIMAL(24,10)) 失败, SELECT CAST('12,345.56' AS MONEY) 会成功的。

    一个警告是 数据类型的精度为小数点后4位,需要显式转换才能达到 DECIMAL 如果你需要的话。

        3
  •  1
  •   Jon Hanna    14 年前

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

        4
  •  1
  •   David    14 年前

    这对我很有用:

    DECLARE @foo NVARCHAR(100)
    SET @foo='12,345.67'
    
    SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10)))
    

    这可能只对逗号不是小数分隔符的排序规则/区域性有效(例如:西班牙语)