当前位置:Gxlcms > 数据库问题 > Powershell--批量拆分SQL语句为事务并批处理

Powershell--批量拆分SQL语句为事务并批处理

时间:2021-07-01 10:21:17 帮助过:3人阅读

= ‘C:\insert_scripts.sql‘ $new_file_path=‘C:\insert_scripts_new.sql‘ $tran_rows=50 $line_content=" SET NOCOUNT ON GO BEGIN TRAN BEGIN TRY " $line_content |Out-File $new_file_path $line_num=1 $sr1=[IO.StreamReader]$old_file_path $line_content="" while(-not $sr1.EndOfStream) { $tmp_content= $sr1.ReadLine() $line_content=$line_content+"`r"+$tmp_content $line_num_mode =$line_num % $tran_rows if($line_num_mode -eq 0) { $line_content=$line_content+" COMMIT PRINT ‘执行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行成功‘ END TRY BEGIN CATCH ROLLBACK PRINT ‘执行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行失败‘ END CATCH GO BEGIN TRAN BEGIN TRY " $line_content | Out-File -Append $new_file_path Write-Host "处理到行" $line_num $line_content="" } $line_num=$line_num+1 } $line_content=$line_content+" COMMIT PRINT ‘执行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行完成‘ END TRY BEGIN CATCH ROLLBACK PRINT ‘执行第"+($line_num-$tran_rows)+"行到第"+($line_num)+"行失败‘ END CATCH GO " $line_content | Out-File -Append $new_file_path $sr1.Close()

还是看点疗效吧,原始SQL为:

技术分享

经过此脚本修改过的变为:

技术分享

这样实现有以下有点:

1.  使用“SET NOCOUNT ON”来屏蔽每条语句返回影响行数,减少与cmd窗口交互的次数;

2.  将每50条语句拆分到一个批处理中,降低数据库进行语法检查分析的消耗,在封装到一个事务中进行提交,减少写日志的次数;

3.  打印输出事务执行结果,方便排查错误(可修改代码只输出执行失败的事务)

执行结果截图:

技术分享

====================================================

在个人电脑测试,以100条一个事务来拆分,大概1分钟可以导入50万到60万,按不同的行数进行拆分插入效率不同,具体合适的拆分行数需要根据实际情况测试为准。

对于超大数据量的导入,还是推荐使用csv+bcp的方式来导入,INSERT+SQLCMD的效率始终太低太低!

====================================================

没啥技术含量,厚脸拿出来分享,只是因为很久没写博客啦!

技术分享

Powershell--批量拆分SQL语句为事务并批处理

标签:

人气教程排行