最近同事遇到了一个 sql 问题,bigint 列和 nvarchar(50) 列关联查询时报错。
首先正常执行时的结果如下:所有记录的 jzjhid 和 ProdBatch 都相等
但如果 where 条件中增加 a.jzjhid=b.ProdBatch 就会报错:从数据类型 nvarchar 转换为 bigint 时出错。
前提要说一下:jzjhid 是 bingint 类型,ProdBatch 是 nvarchar(50) 类型
而事实上这些记录的 ProdBatch 是可以正常转为 bigint 的,如下图:
为什么放在 where 条件中就不行呢.
b 表中有些记录的 ProdBatch 不是数字,这些记录无法转 bigint,
虽然结果中都是数字但 sql 在执行查询时,查询分析器可能会修改执行的先后顺序,先去转换再查询,所以会报错。
where a.jzjhid=cast(iif(isnumeric(b.ProdBatch)=1,cast(b.ProdBatch as varchar(50)),cast(0 as varchar(50))) as bigint)
如果SQL版本是 2012 以后可以用 try_cast() 或 try_convert()
where a.jzjhid=try_cast(b.ProdBatch as bigint)
如有错误之处请指正~