SQL:将数据类型varchar转换为numeric时出错

时间:2010-03-03 04:06:48

标签: sql sql-server

我遇到了一个非常奇怪的问题。有两个SQL查询:

Q1:

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

Q2:

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

除了 PeopleID 之外,我们可以发现这两个查询完全相同。但他们的结果非常不同。对于Q1,我们得到“错误将数据类型varchar转换为数字”;第二季度,它运行良好。我很困惑!

有一些信息可能有用。

tbl_1  ID       numeric(18,0) not null

tbl_2  TargetID varchar(50)   not null

并且Q1或Q2中的每个 TargetID 都可以通过IsNumeric测试(即IsNumeric(TargetID) = 1

另一个信息:如果我们对行AND ID = 49发表评论并且每个查询都运行良好

thx求助

3 个答案:

答案 0 :(得分:2)

我会尝试做这样的事情:

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

因为ID被转换为varchar,所以它应该可以正常工作。

答案 1 :(得分:0)

如何使用EXISTS?

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

答案 2 :(得分:0)

@Vincent在PeopleID ='BBB'时检查TargetID之前或之后是否有空格类型字符(或货币字符)? 如果在TargetID之前或之后有Tab或CrLf等,您将收到此错误消息。但是,常规空格不应该出错。