2016-11-30 108 views
0

我想內部連接一個varchar字段上的smallint字段。我只需要整數值,但我得到一個錯誤。 varchar字段具有整數和字符串。我不需要ID字段只有DESC。內部連接轉換失敗

我得到一個錯誤:

Conversion failed when converting the varchar value 'AWOL' to data type smallint.

這是表的樣子:

================================== 
|ID  |DESC     | 
|==========|=====================| 
|ACAMPROCAL|acamprosate calcium | 
|----------|---------------------| 
|BUPROPION |bupropion   | 
|----------|---------------------| 
|1   |Other    | 
|----------|---------------------| 
|4   |Expired    | 
|----------|---------------------| 
|3   |Dschg    | 
|----------|---------------------| 
|AWOL  |Absence without Leave| 
================================== 

這裏是我做過嘗試,但也註釋掉查詢:

SELECT 
    CASE_NUM, LAST_NAME, FIRST_NAME, MI, '' AS NA, 
    DOB, SEX, [ADDRESS], '' AS NA, CITY, STATE, ZIP 
    --,CONVERT(SMALLINT, CONVERT(VARCHAR(55), CDTBL1.[DESC])) 
    --,CASE WHEN CDTBL1.ID BETWEEN 1 AND 99999 THEN CDTBL1.[DESC] 
    --END AS COUNTY 
FROM 
    CDCLIENT 
INNER JOIN 
    CDTBL1 ON CDCLIENT.ADDR_COUNTY_ID = CDTBL1.ID 
+0

你可以在連接的兩邊執行''varchar''嗎? – abhi

回答

1

變化

'ON CDCLIENT.ADDR_COUNTY_ID = ' 

'ON CAST(CDCLIENT.ADDR_COUNTY_ID as varchar) = ' 

您應該檢查各列的你是加盟的,以確保它們是數據類型相同的類型。 通常我會認爲ID列是某種類型的int,但上面提供的表中也包含ID列中的varchar值。

SQL中的數據類型優先,smallint高於varchar。存在導致失敗的隱式轉換。

此處瞭解詳情:https://msdn.microsoft.com/en-us/library/ms190309.aspx

0

如果你想要非負整數,然後使用這樣的邏輯:

select (case when CDTBL1.[DESC] not like '%[^0-9]%' 
      then convert(smallint, CDTBL1.[DESC]) 
     end) 

請注意,您可能還想檢查字段的長度和值,以確保不會出現錯誤。

在SQL Server 2012+,您使用try_convert()可以簡化這個:

select try_convert(smallint, CDTBL1.[DESC]) 

如果出現的錯誤,這將返回NULL。但是,這不是在SQL Server 2008提供