#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
, что ISvarchar
и они передают ему строку, поэтому в этом бите вообще не должно быть числового приведения. Очевидно, что значения, возвращаемые при изменении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:
Возможно, вам потребуется выполнить явное приведение или преобразование для этого поля.