精易论坛

标题: 批量写入数据库SQL拼接方法 [打印本页]

作者: 李泽勇2    时间: 2023-3-3 15:32
标题: 批量写入数据库SQL拼接方法
一条一条的写入数据库太慢了,何不一次写1000条呢?
分享我平时用的拼接子程序,有更好的写法欢迎评论。
  
子程序名返回值类型公开备 注
SQL拼接插入方法 快速拼接,可以识别行数,主要用于SQL快速批量插入
参数名类 型参考可空数组备 注
文本数据文本型
总数量整数型
拼接行数整数型最小1 最大1000 SQL插入语句拼接最大行数不能超过1000行。
变量名类 型静态数组备 注
原数据文本型 
替换后文本型 
位置整数型 
结果文本型0
sql语句文本型 
替换中文本型 
如果真 (取反 (拼接行数 ≤ 0 拼接行数 > 1000))  ' 判断拼接行数不能等于和小于0且不能大于1000
如果真 (拼接行数 ≤ 总数量)  ' 拼接行数不要大于总数量
拼接行数 = 拼接行数 - 1  ' 用分号识别出现次数,从而计算出行数,这里从0开始
sql语句 = “insert into jsb (工号,姓名,岗位,车间) VALUES ”
计次循环首 (总数量, )
原数据 = 原数据 + “(” + 文本数据 + “);”
替换中 = 取文本左边 (原数据, 取文本长度 (原数据) - 1)
如果真 (文本_取出现次数 (替换中, “;”, ) = 拼接行数)  ' SQL插入语句拼接最大行数不能超过1000行。
替换后 = 子文本替换 (替换中, “;”, “,”, , , )
连续赋值 (“”, 原数据, 替换中)

计次循环尾 ()
如果真 (替换后 ≠ “”)
加入成员 (结果, 替换后)
计次循环首 (取数组成员数 (结果), 位置)
调试输出 (sql语句 + 结果 [位置])
计次循环尾 ()
清除数组 (结果)
替换后 = “”




i支持库列表   支持库注释   
spec特殊功能支持库



文本_取出现次数这个命令精易模块里面有。我就不贴出来了。

作者: jysoft2022    时间: 2023-3-3 17:18
谢谢分享
作者: 熬夜    时间: 2023-3-3 18:35
        开源精神必须支持~
作者: wuqingg    时间: 2023-3-3 18:39

你的思路很好,其实还可以这样,这样也是秒执行


  
子程序名返回值类型公开备 注
执行SQL_多行逻辑型 执行多行SQL语句数组,成功返回真保存记录,失败返回假直接回滚记录
参数名类 型参考可空数组备 注
SQL语句数组文本型
传错误代码整数型返回错误语句序号从1开始;0.未知错误;-1.执行失败,传入空数组
变量名类 型静态数组备 注
ReBool逻辑型语句结果
语句序号整数型语句序号
语句数整数型语句数
语句数 = 取数组成员数 (SQL语句数组)
如果真 (语句数 ≤ 0)
重定义数组 (SQL语句数组, 假, 0)
传错误代码 = -1
返回 ()  ' 如果没有语句传入则返回-1’

开始事务 ()  ' 有语句则开启事务’
计次循环首 (语句数, 语句序号)  ' 循环所有语句,从1开始’
ReBool = 执行SQL (SQL语句数组 [语句序号], )  ' 执行每条语句返回真假’
如果真 (ReBool = )  ' 语句执行失败’
传错误代码 = 语句序号  ' 传回语句错误位置’
回滚事务 ()  ' 直接回滚记录
跳出循环 ()  ' 跳出当前循环

计次循环尾 ()
' 此处未做异常处理,注意!!
保存事务 ()
返回 (ReBool)


作者: 李泽勇2    时间: 2023-3-3 18:47
wuqingg 发表于 2023-3-3 18:39
你的思路很好,其实还可以这样,这样也是秒执行

收到,谢谢!你的也很不错。
作者: NeStedww    时间: 2023-3-3 18:56
会有注入风险。
作者: 一指温柔    时间: 2023-3-3 21:37
感谢分享,很给力
作者: 林深不见鹿    时间: 2023-3-4 03:21
谢谢分享
作者: 千面萌萌    时间: 2023-3-4 03:41
最怕的问题是 表有主键,同时插入的数据已经存在,会导致全部插入失败.
作者: 千面萌萌    时间: 2023-3-4 03:43
wuqingg 发表于 2023-3-3 18:39
你的思路很好,其实还可以这样,这样也是秒执行

事务的我没有用过。事务中每一次执行都真实联网吗?如果量大,耗时还是比较大的吧.
作者: 李泽勇2    时间: 2023-3-4 08:07
千面萌萌 发表于 2023-3-4 03:43
事务的我没有用过。事务中每一次执行都真实联网吗?如果量大,耗时还是比较大的吧. ...

用事务可以加快插入速度和撤销修改。我插入大数据都会用到。
作者: wuqingg    时间: 2023-3-4 08:45
千面萌萌 发表于 2023-3-4 03:43
事务的我没有用过。事务中每一次执行都真实联网吗?如果量大,耗时还是比较大的吧. ...

那肯定真实联网的啦,MYSQL我没试过,SQLite我试过一次2000条,几乎是秒执行
作者: 一指温柔    时间: 2023-3-4 09:12
感谢分享,很给力!~
作者: lvfajun    时间: 2023-3-4 10:54
感谢分享
作者: 熬夜    时间: 2023-3-4 14:32
感谢分享
作者: 千面萌萌    时间: 2023-3-4 16:02
今天特意测试了一下,这样拼接操作,一次性写入20个数据问题不大,如果写入50个数据,一半是失败的,已经是没有主键的了,一个数据平均长度在250字
作者: 潇洒&男孩    时间: 2023-3-4 17:09
千面萌萌 发表于 2023-3-4 03:41
最怕的问题是 表有主键,同时插入的数据已经存在,会导致全部插入失败.

主键一般都是自动递增,不会存在出现重复。特定的需求除外!
作者: 396384183    时间: 2023-3-5 00:50
感谢分享 支持开源 !
作者: zhaode2888    时间: 2023-3-5 13:36
感谢分享
作者: 一指温柔    时间: 2023-3-7 10:19
感谢分享
作者: wgqxj    时间: 2023-3-21 23:31
谢谢分享
作者: 无极    时间: 2023-4-15 02:54
        感谢分享,很给力!~
作者: jz781127    时间: 2023-6-10 12:48
wuqingg 发表于 2023-3-3 18:39
你的思路很好,其实还可以这样,这样也是秒执行

请问:执行SQL 这个命令是哪个支持库里面的?没找到这个命令
作者: wuqingg    时间: 2023-6-10 13:27
jz781127 发表于 2023-6-10 12:48
请问:执行SQL 这个命令是哪个支持库里面的?没找到这个命令
  
子程序名返回值类型公开备 注
执行SQL逻辑型 
参数名类 型参考可空数组备 注
SQL语句文本型本参数提供要执行的SQL语句。有关SQL语句的具体内容请参看SQL的专业手册。
RecordsAffected = 0  ' 类私有成员,也可以理解为程序集变量,数据类型:整数型
Recordset.方法 (“Close”, )  ' 类私有成员,也可以理解为程序集变量,数据类型:对象
Recordset.清除 ()
Recordset = Connection.对象型方法 (“Execute”, SQL语句, RecordsAffected)
返回 (Connection.取错误 ()“”)  ' 类私有成员,也可以理解为程序集变量,数据类型:对象






够清楚了吧

作者: Akari    时间: 2023-6-15 09:01
感谢分享
作者: ouooyo    时间: 2023-6-15 10:18
6666666666666666666666666




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4