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