2017-01-09 97 views
0

我有以下SELECT语句来计算RADIANSCOSSQL Server:错误转换数据类型varchar浮动

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

但我发现了一个错误:

Error converting data type varchar to 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

+2

似乎喜欢您的纬度列包含无效的浮点数据。 – jarlh

+0

@jarlh,是的,你是对的!我在该列中有一些无效的数据,这是因为它是'varchar'类型,它包含'NULL,abc'等。如何克服这个问题? – MAK

+0

“克服”这种最好的方法是当你需要浮动信息时停止使用varchar数据类型。如果NULL导致你的问题,你应该使列不能为空。如果你正确地构建你的数据结构,返回信息是非常容易的。 –

回答

2

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

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

try_convert()是SQL Server 2012+可用。

+0

我正在使用SSMS 2012,但仍无法找到该内置函数。你的脚本给了我''try_convert'不是一个公认的内置函数名'。 – MAK

+0

@MAK SSMS版本不会自动与您的DBMS版本(SQL * Server *)相同。尝试运行'PRINT @@ version'来查看SQL * Server *版本。 –

+0

您是否为该数据库设置了compability级别? 'SELECT compatibility_level FROM sys.databases where name ='your database'' – HoneyBadger

1

您可以使用:

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,所以我不确定什么是,什么是不允许的。例如,您可能希望包含小数点。)

相关问题