2017-01-09 8 views
0

У меня есть следующий оператор SELECT для расчета RADIANS и COS.SQL Server: Ошибка преобразования типа данных varchar в float

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 не совпадает с версией СУБД (SQL * Server *). Попробуйте запустить «PRINT @@ version», чтобы увидеть версию SQL * Server *. –

+0

У вас есть уровень совместимости для этой базы данных? Что делает 'SELECT compatibility_level FROM sys.databases, где name = 'ваша база данных' – HoneyBadger

1

Вы можете использовать:

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

Вы можете использовать THEN для заполнения атрибута с null или другими значениями, если не-конвертируемые значения встречаются. Или вы можете использовать PATINDEX в WHERE, если вы хотите пропустить эти строки вместе. (Возможно, вам придется поиграть с patindex, я обычно не использую floats, поэтому я не уверен, что такое и не разрешено. Например, вы можете включить десятичные точки.)

 Смежные вопросы

  • Нет связанных вопросов^_^