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_TryParseToDecimal的SQL#库(我编写的)中有一个预先完成的函数可以执行此操作。此函数在免费版本中可用,并且适用于从 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)
| 归档时间: |
|
| 查看次数: |
100710 次 |
| 最近记录: |