Странная ошибка SQL-запроса

#sql #sql-server-2005

#sql #sql-server-2005

Вопрос:

Когда я выполняю этот запрос, отображается следующая ошибка.

[Сообщение об ошибке 8114, уровень 16, состояние 5, строка 1
Ошибка преобразования типа данных varchar в float.]

Мне интересно, что ошибка заключается в части сравнения, то есть fb_userevents.userid = '100002917025417' когда эта длинная строка в пределах одного quotзаменяется на 1 или 0, она работает. Вместо кавычек (‘) вокруг него, почему он пытается преобразовать в float??

Я использую SQL Server 2005

 select
    fb_event.eventname
from
    fb_event
inner join
    fb_userevents on fb_userevents.eventid = fb_event.eventid  
where 
    fb_userevents.userid = '100002917025417' 
    and DATEDIFF(hh,fb_event.startdate,getdate()) < 0 
    and  acos(sin(0) * sin(convert(float,altitude))   
         cos(0) * cos(convert(float,altitude)) *
         cos(convert(float,longitude) - 101)) * 6371 <= 1000
  

Изменения и дополнения этого пользователя:
введите описание изображения здесь

Комментарии:

1. о, конечно. Я забыл, что поля идентификаторов должны быть строками. И я использую целые числа….

2. Ошибка будет исходить из недопустимого значения в altitude или longitude

3. что произойдет, если вы попробуете ‘25417’ для значения? Как указывает Мартин, это действительно большое число, которое может обрабатываться по-разному. Мартин может предоставить это в качестве ответа, если это так.

4. @MichaelDurrant — я удалил эту часть своего комментария, потому что OP говорит userid , что IS varchar и они передают ему строку, поэтому в этом бите вообще не должно быть числового приведения. Очевидно, что значения, возвращаемые при изменении where предложения, являются просто разными и недопустимыми числами.

Ответ №1:

Вы уверены, что проблема не в этой строке?

 cos(convert(float,altitude))
  

Какой тип данных — высота? И содержит ли каждое значение в этом столбце только числовые символы?

Комментарии:

1. @XXXcoder — Это то, что вы думаете! Конечно, вы не можете гарантировать это, поскольку используете неправильный тип данных. Попробуйте select convert(float,altitude),convert(float,longitude) from your_table

2. @XXXcoder — Я сильно склонен согласиться с Мартином в том, что, если altitude или longitude являются полями VARCHAR, у вас есть хотя бы одно строковое значение, которое нельзя преобразовать в значение с плавающей запятой.

3. @Dems, я добавил снимок экрана отфильтрованных alt и long этого пользователя. Вы видите какую-нибудь необратимую вещь?

4. @XXXcoder — он не должен принадлежать этому пользователю. CONVERT Может быть нажата до WHERE , поэтому потенциально любое недопустимое значение в этих столбцах может вас испортить.

5. @XXXcoder — Такие факторы, как индексы, могут привести к тому, что (как утверждает Мартин) тригонометрическое условие будет оцениваться перед условием user_id. Чтобы проверить это, вы можете посмотреть план выполнения запроса. Кроме того, я бы рекомендовал проверить все записи в вашей таблице, чтобы узнать, можно ли преобразовать значения в FLOAT или нет.

Ответ №2:

Возможно, вам потребуется выполнить явное приведение или преобразование для этого поля.