SQL Server 2016(SP1)中TRY_CONVERT失效?表连接varchar转numeric报错求解
解决SQL Server关联查询中varchar转decimal的报错问题
我来帮你搞定这个头疼的问题!你遇到的报错本质是SQL Server的执行顺序规则在搞鬼——JOIN关联操作会先于WHERE过滤执行,所以哪怕你在WHERE里加了TRY_CONVERT的判断,那些无法转换的行在JOIN匹配的时候就已经触发类型转换错误了,根本轮不到WHERE来过滤它们。
给你两个靠谱的解决方案,都能避免报错并且自动丢弃无法转换的行:
方案1:在JOIN条件中直接使用TRY_CONVERT
把转换逻辑直接放到ON关联条件里,这样只有能成功转换成decimal(18,0)的行才会参与关联,从根源上避免转换失败:
FROM table1 t1 JOIN table2 t2 ON TRY_CONVERT(decimal(18,0), t1.你的varchar列名) = t2.decimal_column
👉 注意:把t1.你的varchar列名替换成你实际的列名称(你之前写的t1.varchar(50)是数据类型,不是列名哦)。
方案2:提前过滤无效行再关联
先用CTE(公共表表达式)或者子查询,把table1里不能转换成目标数值类型的行提前过滤掉,再和table2做关联:
CTE版本
WITH FilteredTable1 AS ( SELECT * FROM table1 WHERE TRY_CONVERT(decimal(18,0), 你的varchar列名) IS NOT NULL ) SELECT * FROM FilteredTable1 t1 JOIN table2 t2 ON TRY_CONVERT(decimal(18,0), t1.你的varchar列名) = t2.decimal_column
子查询版本
SELECT * FROM ( SELECT * FROM table1 WHERE TRY_CONVERT(decimal(18,0), 你的varchar列名) IS NOT NULL ) t1 JOIN table2 t2 ON TRY_CONVERT(decimal(18,0), t1.你的varchar列名) = t2.decimal_column
这两个方案都能达到你的需求:既不报错,又自动丢弃那些无法转换的行。个人更推荐方案1,写法更简洁,执行效率也不会差。
内容的提问来源于stack exchange,提问作者Chicago1988
相关产品推荐
相关产品推荐

