2017-01-09 96 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,所以我不確定什麼是,什麼是不允許的。例如,您可能希望包含小數點。)

相關問題