마이바티스에서 SQLServer로 insert를 하려고 하는데, 

기존에는 로직에서 for문을 돌려서 insert를 했지만, 마이바티스에서 foreach로 할경우 속도가 엄청나게 차이나는걸 보고

바꿔 보려고 했지만 SQLServer에서는 안되는건 아니지만 제약이 있어서 포기 했다.

받을수 있는 파라미터의 갯수가 2100개 넘어 가면 에러가 난다...

예를들어 컬럼 갯수가 10개인  aaa 테이블에 Mybatis foreach로 insert를 하게 되면 210개만 insert를 할 수 있다는 거다..

근데 좀 웃기는건 Mybatis에서는 파라미터 갯수로 따지지만 Datagrip이나 DB 클라이언트를 이용해서 하게되면, 

row의 갯수로 따지는거 같아 보인다. 

실제로 Mybatis foreach로 insert 할때 210개를 넘겨서 에러를 발생시킨후 로그에 찍히는 쿼리를 복사해서 DB클라이언트에서 실행을 해보면 잘 들어 간다...

만약 엑셀 업로드나 csv 파일을 가지고 SQLServer DB에 insert나 update를 해야 한다면 mybatis foreach를 사용하기 보다는

Bulk Insert를 이용하길 추천한다...

뭐 물론 foreach로 안되는건 아니다. 컨트롤러나 서비스에서 insert or update 할 컬럼 갯수 * row 갯수로 계산해서 파라미터 갯수가 2100개가 넘어가지 않게 for문을 돌리면 Mybatis foreach로 Multi Insert or update를 사용할수 있다.

정리를 해보자면

Mybatis 에서는 SQLServer에 Multi insert or update 할때 파라미터의 갯수가 2100가 넘어가면 안된다.

Multi insert or update 대안으로 Bulk insert를 사용할수 있다.

정도로 정리를 할수 있을거 같다.

복사했습니다!