2016-11-30 59 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提供