【问题标题】:SQL Server: Error converting data type varchar to floatSQL Server:将数据类型 varchar 转换为浮点数时出错
【发布时间】:2026-02-08 10:55:01
【问题描述】:

我有以下SELECT 语句来计算RADIANSCOS

SELECT COS(RADIANS(latitude)) as Lat 
FROM tbl_geometry;

但我收到一个错误:

将数据类型 varchar 转换为 float 时出错。

我的尝试:

尝试 #1

select Cos(convert(float, (Radians(convert(float, latitude))))) as Lat 
from tbl_geometry;

尝试 #2

select Cos(Radians(convert(float, latitude))) as Lat 
from tbl_geometry;

两次尝试都会导致相同的错误。

注意:列Latitude 的类型为varchar

【问题讨论】:

  • 您的纬度列似乎包含无效的浮点数据。
  • @jarlh,是的,你是对的!我在该列中有一些无效数据,那是因为它是 varchar 类型,其中包含 NULL, abc, 等。如何克服这个问题?
  • “克服”这个问题的最佳方法是在需要浮点信息时停止使用 varchar 数据类型。如果 NULL 给您带来问题,您应该使该列不可为空。如果您正确构建数据结构,则检索信息非常轻松。
  • Bad habits to kick : choosing the wrong data type - 你应该始终使用最合适的数据类型 - 毕竟这就是他们的目的!所以为什么在地球上您将您的纬度 - 显然 一个数值 - 存储为 varchar ?!?!?!?

标签: sql sql-server latitude-longitude


【解决方案1】:

使用try_convert()查找无效数据:

select latitude
from tbl_geometry
where try_convert(float, latitude) is null;

try_convert() 在 SQL Server 2012+ 中可用。

【讨论】:

  • 我正在使用 SSMS 2012 但仍然无法找到该内置功能。你的脚本给了我'try_convert' is not a recognized built-in function name
  • @MAK SSMS 版本不会自动与您的 DBMS 版本(SQL Server)相同。尝试运行 PRINT @@version 以查看 SQL Server 版本。
  • 您是否为该数据库设置了兼容性级别? SELECT compatibility_level FROM sys.databases where name = 'your database' 是什么意思
  • @HoneyBadger,兼容等级为100。
  • @PeterB,没错!不一样。这是 2008 R2 (SP1)。那么如何解决这个问题呢? :(
【解决方案2】:

你可以使用:

SELECT      CASE
                WHEN PATINDEX('%[^0-9]%', latitude) > 0 THEN 0
                ELSE Cos(Radians(convert(float,latitude)))
            end as latitude          
FROM        tbl_geometry

如果遇到不可转换的值,您可以使用THENnull 或其他值填充属性。或者,如果您想一起跳过这些行,可以使用 WHERE 中的 PATINDEX。 (您可能不得不玩弄patindex,我通常不使用floats,所以我不确定什么是允许的,什么是不允许的。例如,您可能想要包括小数点。)

【讨论】: