SQL: Ошибка преобразования типа данных varchar в числовой - PullRequest
1 голос
/ 03 марта 2010

Я столкнулся с очень странной проблемой. Есть два sql запроса:

1:

SELECT *
FROM tbl_1
WHERE ID IN (SELECT TargetID
             FROM tbl_2 
             WHERE PeopleID = 'AAA') 
AND ID = 49

2:

SELECT *
FROM tbl_1
WHERE ID IN (SELECT TargetID
             FROM tbl_2 
             WHERE PeopleID = 'BBB') 
AND ID = 49

Мы можем обнаружить, что эти два запроса идентичны, за исключением PeopleID . Но их результат был очень разным. Для Q1 мы получили " Ошибка преобразования типа данных varchar в числовой "; И для Q2, это бежало хорошо. Я был смущен!

Есть некоторая информация, которая может быть полезна.

tbl_1  ID       numeric(18,0) not null

tbl_2  TargetID varchar(50)   not null

и каждый TargetID в Q1 или Q2 может пройти тест IsNumeric (а именно, IsNumeric(TargetID) = 1)

другая информация: если мы прокомментируем строку AND ID = 49 и каждый запрос будет работать хорошо

спасибо за помощь

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

я бы попробовал сделать что-то вроде этого:

SELECT *
FROM tbl_1
WHERE convert(varchar(50), ID) IN (SELECT TargetID
             FROM tbl_2 
             WHERE PeopleID = 'BBB') 
AND ID = 49

, поскольку идентификатор конвертируется в varchar, он должен работать нормально.

0 голосов
/ 22 июня 2017

@ Vincent проверили ли вы, есть ли символы пробела (или символы валюты) до или после TargetID, когда PeopleID = 'BBB'? Вы получите это сообщение об ошибке, если есть TAB или CrLf до или после TargetID. Однако обычный пробел не должен давать ошибку.

0 голосов
/ 03 марта 2010

Как насчет использования EXISTS?

SELECT *
FROM tbl_1
WHERE EXISTS (SELECT *
             FROM tbl_2 
             WHERE PeopleID = 'BBB'
             AND tbl_2.TargetID = tbl_1.ID) 
AND ID = 49
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...