首先来说,SQL没有这种自动更新的功能,如果你是保留旧的数据,忽略新插入的重复数据,不可以设置唯一约束来实现其次,你可以直接在插入代码中处理,也可以用触发器.

解决方案 »

  1.   

    首先 SQL Server没有你说的那种功能其次,是否可以考虑记录每次用户导入的文件名,来防止用户重新导入
      

  2.   


    --楼主可以考虑这样导数据--删除已经存在的
    delete a from user_Info a
    where exists(
    select * from  OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel  5.0')...xactions
    where [user_ID]=a.[user_ID])--插入数据
    insert user_Info
    select * from  OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel  5.0')...xactions
    go
      

  3.   


    --或者写这样的触发器实现自动处理
    create trigger tr_insert_user_Info on user_Info
    instead of insert
    as
    delete a from user_Info a
    where exists(select * from inserted where [user_ID]=a.[user_ID])
    insert user_Info select * from inserted
      

  4.   

    to 邹建
    原来SQLSEVER没有这种可以只需set on/off一下的功能呀你的这两种思路我也曾想到过,但是每次insert数据是都要exists select一下
    会不会影响插入速度。
    这个是我按原来思路写的存储过程
    CREATE PROCEDURE Insert_data  
            @str_a1  char(10),
            @str_a2  char(10)AS
    declare @err intinsert test (a1,a2) values (@str_a1,@str_a2)
    set @err=@@error
    if @err = 2627
    begin
       update test
                   set a1=  @str_a1,
                   a2 = @str_a2
            where a1 = @str_a1
    end
    GO
    思路来源:前几天看你在csdn上关于错误处理想到的,不过需要将test表里的a1
    设为主键,从而使得insert相同主键发生2627错误,在进行错误处理!
    这样是否对插入速度有帮助呢 
      

  5.   

    我不是这个意思,刚才我的存储过程只是测试用的,真正是使用的时候还是会用execl批量导的。
    我是想知道这里是否用错误处理会比exists效率高?
      

  6.   

    to  netcoder(朱二)
    你那种方法不是很好,记录每次用户导入的文件名,来防止用户重新导入,可以使得数据库里没有相同的记录,但是如果相同的文件名里更新里记录就不能更新数据库了。
      

  7.   

    用主键,批量导入,出错时将出错的记录改为更新操作?? 这方法我不会,这样的话无法评判了exists的效率不会很低
      

  8.   

    to 邹兄
    是否我这种利用这种错误处理的方法只能用在单条数据插入,而用在批量导入execl记录是会完全扑捉不导错误,或是扑捉到了但是一次后就程序结束。好像看来真的不能使用错误处理,还是只能使用你的那重exists的处理方式,但是不会因为数据库过于巨大(>5000万)而插入的太慢了,因为客户可以接受的相应时间要5s内(指的是加入一个execl表大约有10万条记录左右的时间)
      

  9.   

    exists的原理是否相当于select * from user_Info一遍?