Answers:
(如果您使用的是SQL Server 2012或更高版本,请参阅@wBob的答案以获取更清洁的方法。仅当您使用SQL Server 2008 R2或更旧版本时,才需要以下答案中概述的方法。)
转换NUMERIC
为时,您不需要(或想要)千位分隔符,无论它是逗号,句点还是空格,因此只需先除去它们。然后将逗号转换为句点/小数,就可以了:
SELECT CONVERT(NUMERIC(10, 2),
REPLACE(
REPLACE('7.000,45', '.', ''),
',', '.'
)
) AS [Converted];
返回值:
7000.45
为了完整起见,我应该提到我也尝试过:
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');
返回值:
7000.45000000000000000000
您正在使用哪个版本的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
高温超导
以下代码适用于我的情况:
select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))
输出:123.456.789,03
VARCHAR
,NVARCHAR
,CHAR
,和NCHAR
类型。在某些情况下,默认值为30;在其他情况下,默认值为1,这将导致代码无法维护/易于出错。2)使用时,您不需要确切的布局#
。您只需要其中一个(例如#
)来表示所有数字,但不需要千位分隔符,或者将其中两个用逗号分隔(例如#,#
)即可得到所有数字和千位分隔符。因此,SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));
返回与您建议的输出相同的输出。