2010-03-03 163 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), –

相關問題