达梦数据库-报错-16-MERGE INTO提示:无效的列名[XX] 目录一、环境信息二、问题描述三、问题截图四、问题原因五、问题解决1、方法一参数MERGE_OPT_FLAG调整2、方法二添加别名六、问题模拟1、参数确认2、报错复现3、解决方法1方法一添加别名2方法二参数MERGE_OPT_FLAG调整一、环境信息名称值CPUx86操作系统KylinV10DM版本DM Database Server 64 V9二、问题描述相同MERGE SQL在达梦8上执行正常在达梦9上执行报错提示无效的列名[XX]三、问题截图四、问题原因新版本merge into默认采用操作符方式兼容oracle模式下识别重名列策略与oracle相同导致的报错。五、问题解决1、方法一参数MERGE_OPT_FLAG调整设置参数MERGE_OPT_FLAG改为0采用MERGE INTO老方式可避免报错。2、方法二添加别名不改参数的情况下在字段前加上B.即可。六、问题模拟1、参数确认SELECT * FROM V$DM_INI WHERE PARA_NAME IN (COMPATIBLE_MODE,MERGE_OPT_FLAG);2、报错复现-- MERGE 核心语句 MERGE INTO emp_target t USING emp_source s ON (t.emp_id s.emp_id) WHEN MATCHED THEN UPDATE SET t.emp_name s.emp_name, t.salary s.salary, t.dept_id s.dept_id, t.update_dt SYSDATE WHEN NOT MATCHED THEN INSERT (emp_id, emp_name, salary, dept_id, update_dt) VALUES (s.emp_id, s.emp_name, salary, s.dept_id, SYSDATE);3、解决方法1方法一添加别名-- MERGE 核心语句 MERGE INTO emp_target t USING emp_source s ON (t.emp_id s.emp_id) WHEN MATCHED THEN UPDATE SET t.emp_name s.emp_name, t.salary s.salary, t.dept_id s.dept_id, t.update_dt SYSDATE WHEN NOT MATCHED THEN INSERT (emp_id, emp_name, salary, dept_id, update_dt) VALUES (s.emp_id, s.emp_name, s.salary, s.dept_id, SYSDATE);salary前添加s.SQL正常执行。2方法二参数MERGE_OPT_FLAG调整SP_SET_PARA_VALUE(1,MERGE_OPT_FLAG,0);如果参数调整不是在当前会话中执行的执行SQL时需重开一个会话因为会话的此值还没有修改。-- MERGE 核心语句 MERGE INTO emp_target t USING emp_source s ON (t.emp_id s.emp_id) WHEN MATCHED THEN UPDATE SET t.emp_name s.emp_name, t.salary s.salary, t.dept_id s.dept_id, t.update_dt SYSDATE WHEN NOT MATCHED THEN INSERT (emp_id, emp_name, salary, dept_id, update_dt) VALUES (s.emp_id, s.emp_name, salary, s.dept_id, SYSDATE);SQL没有修改也可正常执行。