要求:
表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服务器上去的。

解决方案 »

  1.   

    我觉得楼主的三种方法都有些大同小异,因为你在用循环或SQL语或存储过程,所有的操作实质都是由数据库来完成了,它需要解释很多次。
    你可以试试如下方法:
    对于循环或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;
    就该很快。
    可以比较一下。
      

  2.   

    我赞同 zxf_feng(阿日) 的思想,30000条信息分10次提交就可以快很多了,一般的电脑在4分钟应该能搞定
      

  3.   

    zxf_feng(阿日):
    你说的
    with query1 do
    begin
      sql.text:='insert into table1(a,b) values(:a,:b)';
      Parameters.ParamByName('a').values:='';
      Parameters.ParamByName('b').values:='';
      execsql; 
    end;
    循环写在哪里?
      

  4.   

    我做了一下测试,直接用adoconnetion执行存储过程,要执行40秒,程序才会有反应,如果放在一个状态表的触发器里执行,只要8秒,所以建议楼主可以建一个状态表,用update更新该表,以此触发执行存储过程,这样会比用adoconnection或ADOStoredProc1直接执行存储过程快很多,你可以试试
      

  5.   

    状态表随便写一个字段并加入一条记录,用一个update语句来更新记录,目的就是触发该表的触发器,而触发器里就是执行存储过程的内容
      

  6.   

    结论是用存储过程比较好,但我有点不明白。
    存储过程是在服务器执行的,软件运行在客户端,点击按钮(按钮代码是ADOStoredProc1.ExecProc;),再在资源管理器里将程序结束掉,为什么服务器只插入了部分数据?难道存储过程的执行还要依靠程序?