SQL使用UNION ALL添加统计行时出现varchar转int错误如何解决?
解决SQL UNION ALL中的类型转换错误问题
我来帮你搞定这个问题!你遇到的转换错误本质是UNION ALL对数据类型的一致性要求在搞鬼,咱们一步步拆解解决:
错误原因
当使用UNION ALL合并多个结果集时,SQL Server要求所有结果集的对应列必须是兼容的数据类型,而且它会按照「数据类型优先级」自动做隐式转换。int类型的优先级比varchar高,所以数据库会尝试把前面的字符串(表头、明细行的拼接结果)转换成int,这显然不符合逻辑,于是就抛出了转换失败的错误。
解决方案
核心思路是把统计行的结果统一转换成字符串类型,让它和前面的结果集类型完全匹配。你只需要修改统计行的代码,用CAST或者CONVERT把COUNT(*)的数值结果转成字符串后再拼接文本:
修改后的完整查询示例
SELECT 'REC_TYPE'+CHAR(199)+'PLAN_ID'+CHAR(199)+...+'DATE_ANSWERED' UNION ALL SELECT REC_TYPE+CHAR(199)+ PLAN_ID+CHAR(199)+ ...+ Convert(char(10),DATE_ANSWERED,101) FROM #My_Temp_Table UNION ALL SELECT CAST(COUNT(*) AS VARCHAR(10)) + ' rows selected' -- 关键:将统计数转为字符串 FROM #My_Temp_Table
可选写法(用CONVERT)
如果你习惯用CONVERT,效果完全一致:
SELECT CONVERT(VARCHAR(10), COUNT(*)) + ' rows selected'
小提示
如果你的临时表行数特别多(超过10位数字),可以把VARCHAR(10)改成更大的长度(比如VARCHAR(20)),避免统计数字被截断。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

