Sql 数据类型不匹配导致转换错误

Sql 数据类型不匹配导致转换错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,当我执行此命令时 UPDATE #Export SET LANID = SubString(DBF.LANID,1,10),New_LANID = DBF.LANID FROM #Export SE Left JOIN tbl_PERSON_BLUE_ALL_VW_SOAtoOracle DBF ON Convert(Int,DBF.persn_Id)=SE.emp_id 我得到这个错误 Msg 245, Level 16, State 1, Line

当我执行此命令时

UPDATE #Export 
SET LANID = SubString(DBF.LANID,1,10),New_LANID = DBF.LANID          
FROM #Export SE      
Left JOIN tbl_PERSON_BLUE_ALL_VW_SOAtoOracle DBF 
ON 
Convert(Int,DBF.persn_Id)=SE.emp_id  
我得到这个错误

Msg 245, Level 16, State 1, Line 159
Conversion failed when converting the varchar value '000G76007' to data type int.
修改联接似乎可以修复它

UPDATE #Export 
SET LANID = SubString(DBF.LANID,1,10),New_LANID = DBF.LANID          
FROM #Export SE      
Left JOIN tbl_PERSON_BLUE_ALL_VW_SOAtoOracle DBF 
ON 
TRY_CAST(DBF.persn_Id as int) IS NOT NULL AND
Convert(Int,DBF.persn_Id)=SE.emp_id   
是否仍有失败的可能性?有更好的解决方法吗?

使用
试试convert()

注:

  • TRY\u CONVERT()
    将消除转换错误。通过转换为int,还可以消除前导零的问题
  • 这两个ID的类型应该相同!您甚至不能声明正确的外键关系
  • 在这种情况下,
    LEFT()
    SUBSTRING()更方便
  • 使用
    FROM
    子句中定义的表别名。事实上,我认为SQL Server中有一个bug,即使它有表别名,也可以直接引用表。

文本值
000G76007
永远不会转换为整数。因此,要么您铸造了错误的列,要么您将不得不进入表中并删除非整数文本值。这可能只有两个位置<代码>转换(int,DBF.persn\u Id)
SE.emp\u Id
。其中一列的值不是整数,您试图将其转换为
int
。但是,为什么要将
int
varchar
进行比较?在联接中强制执行try_将导致删除非整数行(如“000G76007”)。然而,这并不能解决根本问题。正如其他人所问的,为什么要将一个明显包含字母值的列与一个整数列进行比较?因为当个人ID是数字时,LAN ID是有用的信息。谢谢。只要它仍然能工作,那就更干净了,我希望它能工作。我知道有时候并行性对操作执行时间的影响会导致偶尔的“随机性”errors@ChadD . . . 它可能是并行环境。它更有可能是优化器。某些执行计划可能会尝试转换,即使其他筛选器会过滤掉该行。
UPDATE SE
    SET LANID = LEFT(DBF.LANID, 10),
        New_LANID = DBF.LANID          
    FROM #Export SE LEFT JOIN   
        tbl_PERSON_BLUE_ALL_VW_SOAtoOracle DBF 
        ON TRY_CONVERT(INT, DBF.persn_Id) = SE.emp_id ;