将逗号作为小数点分隔符的字符串数值转换为 NUMERIC(10, 2)

Pan*_*lat 13 sql-server t-sql type-conversion decimal string

我有一个包含希腊格式数字的 varchar 列的 SQL 表(。作为千位分隔符,逗号作为小数点分隔符)

经典的转换

CONVERT(numeric(10,2),REPLACE([value],',','.'))
Run Code Online (Sandbox Code Playgroud)

不起作用,因为 . (千位分隔符)杀死转换

例如尝试

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))
Run Code Online (Sandbox Code Playgroud)

我想将这些值转换为数字(10,2)

有关如何处理的任何建议?

wBo*_*Bob 12

您使用的是什么版本的 SQL Server?从 SQL Server 2012 开始,您可以将TRY_PARSE与其USING culture参数一起使用。您也可以使用PARSE,不同之处在于PARSE如果转换失败TRY_PARSE将失败并返回 a NULL,例如

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t
Run Code Online (Sandbox Code Playgroud)

检测结果

HTH


Sol*_*zky 10

如果您使用的是 SQL Server 2012 或更高版本,请参阅 @wBob 的答案以获得更简洁的方法。仅当您使用 SQL Server 2008 R2 或更早版本时才需要使用下面我的答案中概述的方法。

在转换为 时NUMERIC,您不需要(或想要)千位分隔符,无论是逗号、句点还是空格,所以先去掉它们。然后将逗号转换为句点/小数,你就完成了:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];
Run Code Online (Sandbox Code Playgroud)

返回:

7000.45
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我应该提到我也尝试过:

  • SET LANGUAGE Greek;

  • 查看CONVERT 的各种格式样式,但此处不适用。

  • 格式的功能,但输入型必须是数字或日期/时间/日期时间值(即,它在SQL Server 2012中引入,所以并不适用于SQL Server 2008 R2或以上)。

其他似乎都不起作用。我希望找到比两次REPLACE调用更优雅的东西,但到目前为止还没有这样的运气。


另外,顺便提一下,虽然这不是纯 T-SQL 解决方案,但也可以通过 SQLCLR 来完成。而且,在名为String_TryParseToDecimalSQL#库(我编写的)中有一个预先完成的函数可以执行此操作。此函数在免费版本中可用,并且适用于从 SQL Server 2005 开始的每个版本的 SQL Server:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');
Run Code Online (Sandbox Code Playgroud)

返回:

7000.45000000000000000000
Run Code Online (Sandbox Code Playgroud)