2010-03-03 122 views
1

我遇到了一个非常奇怪的问题。有两个SQL查询:SQL:将数据类型varchar转换为数字时出错

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目标ID可以通过IsNumeric测试(即IsNumeric(TargetID) = 1

另一个信息:如果我们注释行AND ID = 49和每一个查询运行良好

THX为你的帮助

+1

为什么你在varchar(50)数据类型中有数字? –

+4

此表由其他人创建,而非我。出于某种原因,我必须使用它。 :) – Vincent

回答

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

谢谢。我以前尝试过,它确实有效。但我想知道更多,想知道是什么导致了差异。 :) – Vincent

+0

请注意,如果tbl_1.ID中存在索引,则由于转换而不能再由此查询使用。例如,谷歌[sargs sql server搜索参数] –

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 
+0

对不起,它不能工作。 Q1返回相同的错误,Q2运行良好。 – Vincent

0

@Vincent您是否检查过PeopleID ='BBB'时TargetID前后是否有空格字符(或货币字符)? 如果在TargetID之前或之后有Tab或CrLf等,您将收到此错误消息。然而,一个普通的空白不应该给出错误。

+1

请注意,对于某些非数字字符,IsNumeric()也会返回true。 [链接](https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql), –

相关问题