今天在测试一个批量新增的功能时,发现报了一个错误,
SQL: INSERT INTO base_ac_role_module(ROLEID,MODULEID,ISOPER,ISAUTH) VALUES( ( ?,?,?,? ) ) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: ',' 附近有语法错误。 ; uncategorized SQLException; SQL state [S0001]; error code [102]; ',' 附近有语法错误。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: ',' 附近有语法错误。
刚开始以为是xml中批量新增的语法写错了,经过排查没有发现错误,刚开始写法如下:
<insert id="saveModuleRole">
INSERT INTO base_ac_role_module(ROLEID,MODULEID,ISOPER,ISAUTH)
values
<foreach item="item" collection="moduleList" index="index" open="(" close=")" separator=",">
#{roleId}, #{item.moduleId}, #{item.moduleRoleOperable}, #{item.moduleRoleMayAuthorize}
</foreach>
</insert>
最后想到我们的项目原先连的数据库是mysql,所以xml中的语法都是针对mysql写的,后面换成了sqlserver,会不会是sqlserver不支持这种写法,后来通过查资料得知,sqlserver确实不支持这种写法,最后改成了下面的写法,顺利解决。
<insert id="saveModuleRole">
INSERT INTO base_ac_role_module(ROLEID,MODULEID,ISOPER,ISAUTH)
select
<foreach item="item" collection="moduleList" index="index">
<if test="index != 0">
union select
</if>
#{roleId}, #{item.moduleId}, #{item.moduleRoleOperable}, #{item.moduleRoleMayAuthorize}
</foreach>
</insert>
要特别注意的一点是:sqlserver这种写法只支持2100个字符,当拼接数据过大时,会出现插入错误的情况,所以写的时候需要控制list条数