关于mysql与sqlserver批量新增的语法差别

    今天在测试一个批量新增的功能时,发现报了一个错误,

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条数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值