Sql 内部联接上的转换失败

Sql 内部联接上的转换失败,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在尝试将一个smallint字段内部联接到varchar字段上。我只需要整数值,但我得到一个错误。varchar字段包含整数和字符串。我不需要ID字段,只需要描述 我得到一个错误: 将varchar值“AWOL”转换为数据类型smallint时,转换失败 这是表格的外观: ================================== |ID |DESC | |==========|=====================| |ACAMP

我正在尝试将一个smallint字段内部联接到varchar字段上。我只需要整数值,但我得到一个错误。varchar字段包含整数和字符串。我不需要ID字段,只需要描述

我得到一个错误:

将varchar值“AWOL”转换为数据类型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

如果需要非负整数,请使用如下逻辑:

select (case when CDTBL1.[DESC] not like '%[^0-9]%'
             then convert(smallint, CDTBL1.[DESC])
        end)
请注意,您可能还需要检查字段的长度和值,以确保不会出现错误

在SQL Server 2012+中,可以使用
try\u convert()
简化此过程:


如果发生错误,则返回
NULL
。但是,它在SQL Server 2008中不可用。

如果需要非负整数,请使用如下逻辑:

select (case when CDTBL1.[DESC] not like '%[^0-9]%'
             then convert(smallint, CDTBL1.[DESC])
        end)
请注意,您可能还需要检查字段的长度和值,以确保不会出现错误

在SQL Server 2012+中,可以使用
try\u convert()
简化此过程:

如果发生错误,则返回
NULL
。但是,它在SQL Server 2008中不可用。

更改

'ON CDCLIENT.ADDR_COUNTY_ID = ' 

'ON CAST(CDCLIENT.ADDR_COUNTY_ID as varchar) = '
您应该检查要连接的列的数据类型,以确保它们是相同的类型。 一般来说,我认为ID列应该是某种类型的int,但是上面提供的表在ID列中也包含varchar值

SQL中的数据类型具有优先级,smallint在varchar之上。发生了导致故障的隐式转换

更多信息请点击此处:

更改

'ON CDCLIENT.ADDR_COUNTY_ID = ' 

'ON CAST(CDCLIENT.ADDR_COUNTY_ID as varchar) = '
您应该检查要连接的列的数据类型,以确保它们是相同的类型。 一般来说,我认为ID列应该是某种类型的int,但是上面提供的表在ID列中也包含varchar值

SQL中的数据类型具有优先级,smallint在varchar之上。发生了导致故障的隐式转换


此处的详细信息:

这是隐式转换的问题,SQL Server选择了错误的数据进行转换。通常,当您需要比较不同的数据类型时,通常最好显式地将一种数据类型转换为另一种数据类型

微软有一张漂亮的桌子


这是隐式转换的问题,SQL Server选择了错误的数据进行转换。通常,当您需要比较不同的数据类型时,通常最好显式地将一种数据类型转换为另一种数据类型

微软有一张漂亮的桌子


可以在联接的两侧执行
强制转换为varchar
吗?可以在联接的两侧执行
强制转换为varchar
吗?