现在我要读取n个二进制文件,然后循环插入到数据库中,文件的数据大约有100w条,每条记录有50个字段,插入的同时,还要避免插入重复项,我的方法是
循环读取
{
  先检查后插入数据库,写成存储过程
}
数据量少还可以,但数据量多的时候,运行很慢,我觉得这样试用存储过程,和直接使用sql没什么优势可言我想到另一个办法,就是设置主键,避免插入重复
循环读取
{
  try
  插入数据库,写成存储过程
  catch
  捕获sql主键重复异常,跳出
}
这样虽然不用判断,但如果重复,每次都要捕获异常,效率好像也差不多大家有没什么更好的办法,避免插入重复,而且效率高的,还有,关于这里的存储过程,我想能不能一次性构造一条语句,像
insert 表 seletc 字段1,字段2....union selec 字段1,字段2......
不知道这样可否,不然在循环中反复创建con对象,使用完后再释放,消耗不少资源
大家帮帮忙,讨论下,谢谢了

解决方案 »

  1.   

    给不能重复的列加一个唯一非聚集索引,并设置unique属性为on--例子:
    create table tb2(name varchar(20))
    create unique index idx_01 on tb2(name)with(ignore_dup_key=on)
    insert into tb2 select 'a'
    insert into tb2 select 'b'
    insert into tb2 select 'b'
    insert into tb2 select 'c'
    select * from tb2
    /*
    ---
    a
    b
    c
    */
      

  2.   

    服务器: 消息 2627,级别 14,状态 1,行 1
    违反了 PRIMARY KEY 约束 'PK_Datarec'。不能在对象 'Datarec' 中插入重复键。
    语句已终止。和设置主键返回的错误是一样的,2627,有没办法发现重复主键自动跳过的呢
      

  3.   

    ignore_dup_key=on
    这句是05才有的吧,我用的是2000
      

  4.   

    sql server 2000  也有 IGNORE_DUP_KEY.你建一个唯一的非聚集索引,并指定IGNORE_DUP_KEY=ON
    这样你在导入时,用循环
    拼一堆:"insert into ..."
    然后,一并提交给sql server去执行。
      

  5.   

    恩,可以了,谢谢楼上的
    现在我有个问题,就是如果用insert 表 select。union all select。
    这样去提交sql的话,会不会因为这个insert的sql过长,而出现提交错误,比如后面连接了100w个select
      

  6.   

    使用批量提交,把connect放在循环外面,如果是java还需要把statement等都放在外面!!然后使用addBath