SQL Server [案例] SQL where 条件中从数据类型 nvarchar 转换为 bigint 时出错

xinggang · 2019年01月15日 · 179 次阅读

最近同事遇到了一个 sql 问题,bigint 列和 nvarchar(50) 列关联查询时报错。
首先正常执行时的结果如下:所有记录的 jzjhid 和 ProdBatch 都相等 2019011583726
但如果 where 条件中增加 a.jzjhid=b.ProdBatch 就会报错:从数据类型 nvarchar 转换为 bigint 时出错。 2019011583733
前提要说一下:jzjhid 是 bingint 类型,ProdBatch 是 nvarchar(50) 类型
而事实上这些记录的 ProdBatch 是可以正常转为 bigint 的,如下图: 2019011583740
为什么放在 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)

如有错误之处请指正~

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册