转换NVARCHAR到MONEY或FLOAT格式(Convert NVARCHAR to MONEY

2019-10-30 01:55发布

我的问题:我有存储在数字的表(从Excel导入到SQL Server 2008) NVARCHAR(255)格式。

试图将这些列FLOATMONEYNUMERIC失败, CONVERTCAST功能:

ORIGBAL   = CAST(ORIGBAL AS FLOAT)
ORIGBAL   = CAST(ORIGBAL AS MONEY)
ORIGBAL   = CAST(ORIGBAL AS MONEY)
ORIGBAL   = CONVERT(decimal(12,2),ORIGBAL)

该消息是在所有情况下(或类似的失败的错误消息):

误差数据类型为nvarchar转换为数字。

Answer 1:

听起来,因为你必须存储在一个字符串列数值数据,你有不良数据。 以确定它的一个方法是:

SELECT key_column, ORIGBAL
  FROM dbo.tablename
  WHERE ORIGBAL LIKE '%[^-.0-9]%';

修正了数据(可能包含逗号,但可能的伤害比这更糟糕,像一些价值观具有完全非数字数据-否则转换为MONEY应该有工作)。 如果您发现很多行包含逗号,那么你可以简单地运行更新:

UPDATE dbo.tablename SET ORIGBAL = REPLACE(ORIGBAL, ',', '');

然后再次运行上面的查询。 如果未返回行,现在你可以转换为“正常”的数字类型,而不是MONEYFLOAT这确实应该非常特殊的情况恕我直言保留。

没有固定的数据,你可以让你的生活变得更加复杂使用CASE中所有的查询表达式:

SELECT key_column, CONVERT(DECIMAL(12,2), CASE 
  WHEN ORIGBAL LIKE '%[^-.0-9]%' THEN ORIGBAL END
FROM dbo.tablename
...

这将产生NULL值,而不是坏的,非数值。 然而,它仍然可能会失败,如该表达式将通过为0.0.0.44.02这显然不能被转换为十进制。 举个例子:

DECLARE @x TABLE(ORIGBAL NVARCHAR(255));

INSERT @x VALUES('bob'),('0.0.0.44.02'),('32500.40');

SELECT ORIGBAL, [status] = CASE WHEN ORIGBAL LIKE '%[^.0-9]%' 
  THEN 'needs correcting' ELSE 'all good' END
FROM @x;

结果:

bob          needs correcting
0.0.0.44.02  all good
32500.40     all good

为了识别与多个小数点的情况下,你可以这样做:

SELECT ORIGBAL, [status] = CASE WHEN ORIGBAL LIKE '%[^.0-9]%'
  OR LEN(ORIGBAL)-LEN(REPLACE(ORIGBAL,'.','')) > 1 
  THEN 'needs correcting' ELSE 'all good' END
FROM @x;

结果:

bob          needs correcting
0.0.0.44.02  needs correcting
32500.40     all good

您还可能有超过最终的转换值,例如'12345678901234.56'是太大DECIMAL(12,2)

在SQL Server 2012中,你将有上面的表达式简写:

SELECT key_column, TRY_CONVERT(DECIMAL(12,2), ORIGBAL)
FROM dbo.tablename
...

...这产生NULL值甚至像更复杂的值0.0.0.44.02



Answer 2:

CAST不能很好地反应逗号和美元符号。 你可能有CONVERT更好的运气...

SELECT CONVERT(money, '$1,123.45')

如果你必须有它的十进制转换成钱,然后十进制...

SELECT CAST(CONVERT(money, '$1,123.45') AS decimal(12,2))


文章来源: Convert NVARCHAR to MONEY or FLOAT format