【问题标题】:SQL Code Error converting data type varchar to float将数据类型 varchar 转换为浮点数的 SQL 代码错误
【发布时间】:2019-10-14 13:35:09
【问题描述】:

以下代码在 Microsoft Server Management Studion 中执行时遇到错误:

USE [DST]
GO

Select 
  CAST([Balance] as float)
FROM [RAW_XXX] 
WHERE ISNUMERIC(Balance) = 1

消息 8114,第 16 级,状态 5,第 2 行 将数据类型 varchar 转换为 float 时出错。

我认为ISNUMERIC 会排除任何无法转换或转换的内容。

它是 SQLServer 2012 中的一个海量数据库,所以我不确定如何找到导致错误的数据。

【问题讨论】:

  • 您是否尝试过SELECT * FROM RAW_XXX WHERE ISNUMERIC(Balance) <>1 来查找导致错误的数据?
  • @daShier 是的。删除这些行并不能解决我的问题。

标签: sql sql-server-2012


【解决方案1】:

使用TRY_CONVERT 清除违规记录:

SELECT * 
FROM [RAW_XXX] 
WHERE TRY_CONVERT(FLOAT, Balance) IS NULL;

您当前逻辑的问题是,根据ISNUMERIC$123.45 之类的内容将是正确的,但在尝试转换为浮点数时会失败。

顺便说一句,如果您想要一种更简单的方法来查找不可转换为浮动的记录,您可以依赖LIKE

SELECT *
FROM [RAW_XXX]
WHERE Balance NOT LIKE '%[^0-9.]%' AND Balance NOT LIKE '%.%.%';

第一个LIKE 条件确保Balance 仅包含数字和小数点,第二个条件确保最多出现一个小数点。查看下面的演示以查看此功能。

Demo

【讨论】:

  • $405.27 会通过 ISNUMERIC 但不会通过 CAST
  • @Gerhard 我打算对此发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多