要求:
表tb1里插入30000条信息。
10001, 'aaa'
10002, 'aaa'
....
40000, 'aaa'
-----------------------
我用三种方法:方法一(程序循环实现):
for i:=10001 to 40000 do
begin
ss:='insert into tb1 values('+IntToStr(i)+',''aaa'');
query1.close;
query1.sql.text:=ss;
query1.ExecSql;
end;
----------------
方法二(SQL语句实现):
ss:= 'declare @myii int';
ss:=ss+'set @myii=10001 ';
ss:=ss+'while (@myii <= 40000) ';
ss:=ss+'begin ';
ss:=ss+'insert into tb1 values(@myii,'aaa') ';
ss:=ss+'set @myii=@myii+1 ';
ss:=ss+'end ';
query1.close;
query1.sql.text:=ss;
query1.ExecSql;
----------------
方法三(存储过程实现):
在数据库里建立存储过程:
CREATE PROCEDURE MySto AS
declare @myii int
set @myii=10001
while (@myii <= 40000)
begin
insert into tb1 values(@myii,'aaa')
set @myii=@myii+1
end
GO
然后程序里调用存储过程MySto
ADOStoredProc1.ExecProc;
-----------------------------------
发现,3种方法,当程序运行中,用任务管理器结束程序,都中断了插入操作,即只插入了部分数据。
我希望程序执行了这个段代码后,能马上执行下边的语句,不用等插入(要是插入10万,不是要N久了嘛)。说明:程序连接到局域网另外一台电脑的MS SQL服务器上去的。
表tb1里插入30000条信息。
10001, 'aaa'
10002, 'aaa'
....
40000, 'aaa'
-----------------------
我用三种方法:方法一(程序循环实现):
for i:=10001 to 40000 do
begin
ss:='insert into tb1 values('+IntToStr(i)+',''aaa'');
query1.close;
query1.sql.text:=ss;
query1.ExecSql;
end;
----------------
方法二(SQL语句实现):
ss:= 'declare @myii int';
ss:=ss+'set @myii=10001 ';
ss:=ss+'while (@myii <= 40000) ';
ss:=ss+'begin ';
ss:=ss+'insert into tb1 values(@myii,'aaa') ';
ss:=ss+'set @myii=@myii+1 ';
ss:=ss+'end ';
query1.close;
query1.sql.text:=ss;
query1.ExecSql;
----------------
方法三(存储过程实现):
在数据库里建立存储过程:
CREATE PROCEDURE MySto AS
declare @myii int
set @myii=10001
while (@myii <= 40000)
begin
insert into tb1 values(@myii,'aaa')
set @myii=@myii+1
end
GO
然后程序里调用存储过程MySto
ADOStoredProc1.ExecProc;
-----------------------------------
发现,3种方法,当程序运行中,用任务管理器结束程序,都中断了插入操作,即只插入了部分数据。
我希望程序执行了这个段代码后,能马上执行下边的语句,不用等插入(要是插入10万,不是要N久了嘛)。说明:程序连接到局域网另外一台电脑的MS SQL服务器上去的。
解决方案 »
- CMWantSpecialKey 为什么会执行 两次 呢? 怪怪~~~~~~~~~~~~~~~
- FASTREPORT 3.0打印问题,我不能直接打印,非要预览一次,后续打印才有反应
- inaccessible value
- 关于Delphi编译后的可执行文件执行出错的一个问题(又是最后十分)
- gmail邀请发放
- DBChart的图形怎么保存,保存的扩展名是什么,怎么样再打开保存后的文件
- 编程如何能让文件夹彻底隐藏??
- c++ to pascal 在线等!
- 关于paradox的小问题!
- 链接数据库方式?
- 如何在DBCtrlGrid的DragDrop事件里获取当前鼠标停留的那块区域呢?
- 我想判断一个edit.text里面输入的是不是日期类型的数据,delphi里面有没有相关的函数?谢谢
你可以试试如下方法:
对于循环或sql语句的改进:
采用参数的形式:
with query1 do
begin
sql.text:='insert into table1(a,b) values(:a,:b)';
Parameters.ParamByName('a').values:='';
Parameters.ParamByName('b').values:='';
execsql;
end;
这样循环,数据库只解释一次语句。第二种:你可以采用批量执行SQL。
首先将SQL放一个临时文件中或tStringlist中。
然后:sql.text:=tstringlist.text;
execsql;
就该很快。
可以比较一下。
你说的
with query1 do
begin
sql.text:='insert into table1(a,b) values(:a,:b)';
Parameters.ParamByName('a').values:='';
Parameters.ParamByName('b').values:='';
execsql;
end;
循环写在哪里?
存储过程是在服务器执行的,软件运行在客户端,点击按钮(按钮代码是ADOStoredProc1.ExecProc;),再在资源管理器里将程序结束掉,为什么服务器只插入了部分数据?难道存储过程的执行还要依靠程序?