我觉得没有必要做修改。因为在Ms SqlServer 中修改记录相当于把原记录删除再新增新的记录。所以如果记录已存在的话我觉得应删除了再新增新的记录。

解决方案 »

  1.   

    可用一条语句实现,如下:
      if Exists(Select * from 表名 where 主键='')
         Delete 表名 where 主键=''
      Insert Into 表名 values(.....)
      

  2.   

    谢谢!
    那在客户端程序中是不是可以这样写
    Dim StrSQL as String
    For i=1 to 1000
      strSql="if Exists(Select * from 表名 where 主键=" & i & ") " & _
             " Delete 表名 where 主键=" & i & _ 
             " Insert Into 表名 values(.....)"
      rs.open(strSql, ....)
      rs.close
    Next
    我感觉这样的效率是不是很低啊?
      

  3.   

    建立临时表存储要更新的数据不管多少数据,用两个语句
    一个insert
    一个update就可以了
      

  4.   

    没这么复杂,因为你的想法在导入导出时经常会用到,这和DELPHI的UPDATE一样,用这个存储过程,可以省你的一切烦恼
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO/****** Object:  Stored Procedure dbo.RUpdatetable    Script Date: 2003-03-06 14:17:10 ******/  
        
    /****************************************  
    Function:  
      R_ImportTable用于从源表更新目的表,更新目的表中  
     关键字与源表关键字相同的数据记录,当源表中含有目的表中  
     不存在的记录时把不存在的记录插入到目的表中  
    Prameter:  
      @TableNo传递的目的表表名称或表ID号,@Flags为更新参数,当为0  
      时把目的表替换为源表,当为1时仅更新不相同与不存在于目的表  
      中的记录。  
    Note:  
    不支持无主关键字段表结构  
    ************************************/  
    ALTER                     Proc R_ImportTable(@SourceTable varchar(30),
                                @DestTable   varchar(30) ,
                                @Flags       bit)  
    as 
    Begin    
      declare @error int    
      declare @ErrorId Int  IF  NOT EXISTS(SELECT name  FROM sysobjects WHERE  name =@DestTable AND type = 'U')  
      begin  
       raiserror('您所更新的数据表%s不存在,请核对。', 16, 1, @DestTable)  
       return  
      end  
      /*---出现错误时,进行临时表的更改
       exec('drop table '+@DestTable)
       exec(' select * into '+@DestTable+ ' from '+@sourceTable)
       */  
      IF  NOT EXISTS(SELECT name  FROM   sysobjects WHERE  name =@SourceTable AND type = 'U')  
      begin  
       raiserror('您所更新的对照数据表%s不存在,请核对。', 16, 1, @SourceTable)  
       return  
      end  
    begin tran 
       declare @FieldStr nvarchar(50),@OneKeyF nvarchar(50),@SetStr nvarchar(1000)  
        declare @ListTstr nvarchar(1000),@ListFStr nvarchar(1000)  
        declare @IncField nvarchar(50)  
      
       set @SetStr  =''--更新字段  
       set @FieldStr=''--表字段变量  
       set @ListFStr=''--目的表字段列表  
       set @ListTstr=''--临时表字段列表  
       set @OneKeyF =''--一个关键字段  
       set @IncField=''--自增类型字段    if @Flags=0   
       begin  
         select @IncField=name from syscolumns --找出自增类型  
          where id = OBJECT_ID(@DestTable) and colstat & 1 = 1    
      
         declare Enum_Field cursor for   ---枚举表字段  
             (select name from syscolumns  where id=OBJECT_ID(@DestTable))  
         open Enum_Field   
         fetch next from Enum_Field  into @FieldStr  
         while @@fetch_status=0   
         begin  
           if (@FieldStr<>@IncField)  
           begin   
             set @ListFStr=@ListFStr+@FieldStr+','  
           end   
           fetch next from Enum_Field  into @FieldStr  
         end  
         close Enum_Field   
         deallocate Enum_Field   
       
       
         set @ListFStr=substring(@ListFStr,1,len( @ListFStr)-1)      
         if (@DestTable  not in ('hs_000a','hs_000b'))
         begin
       exec('truncate table '+@DestTable)    
       set @error = @@error 
               set @ErrorId=103601     
       if @error <> 0 goto error 
         end 
         exec('insert into '+@DestTable + '(' + @ListFStr + ')' +' select ' + @ListFStr + '  from '+@SourceTable)  
         
       set @error = @@error
               set @ErrorId=103602      
       if @error <> 0 goto error   
       end  
      else if @Flags=1   
      begin  
       select @IncField=name from syscolumns --找出自增类型  
        where id = OBJECT_ID(@DestTable) and colstat & 1 = 1    
      
       declare Enum_Field cursor for   ---枚举表字段  
             (select name from syscolumns  where id=OBJECT_ID(@DestTable))  
       open Enum_Field   
       fetch next from Enum_Field  into @FieldStr  
       while @@fetch_status=0   
       begin  
         if (@FieldStr<>@IncField)  
         begin   
           Set @SetStr=@SetStr+@FieldStr+'=T.'+@FieldStr+','  
           set @ListFStr=@ListFStr+@FieldStr+','  
           set @ListTstr=@ListTstr+'T.'+@FieldStr+','  
           set @OneKeyF=@FieldStr  
         end   
         fetch next from Enum_Field  into @FieldStr  
       end  
       close Enum_Field   
       deallocate Enum_Field   
       
       
       Set @SetStr   =substring(@SetStr,   1,len(@SetStr)-1 )  
       set @ListFStr=substring(@ListFStr,1,len( @ListFStr)-1)  
       set @ListTStr=substring(@ListTStr,1,len( @ListTStr)-1)  
           if NOT EXISTS(select name from dbo.R_GetTableIndex(@DestTable) )
      begin 
        if (@DestTable  not in ('hs_000a','hs_000b'))
        begin
          exec('truncate table '+@DestTable)    
       set @error = @@error  
               set @ErrorId=103603    
       if @error <> 0 goto error   
        end
       exec('insert into '+@DestTable+' select *  from '+@SourceTable)        
       set @error = @@error
               set @ErrorId=103604      
       if @error <> 0 goto error
         commit tran  
         return    
      end  
      
        declare @ConditionStr nvarchar(1000)---修改条件   
        set @ConditionStr=''
       declare Enum_PrimaryKey cursor for  ---枚举关键字  
        select name from dbo.R_GetTableIndex(@DestTable) 
       
       Open Enum_PrimaryKey  
       Fetch Next from Enum_PrimaryKey into @FieldStr     
       if @@fetch_status<>0   
       begin   
           close Enum_PrimaryKey  
           deallocate Enum_PrimaryKey  
           raiserror('您所更新的对照数据表%s不存关键字段,本过程无法处理!', 16, 1, @DestTable)  
         return  
       end  
       while @@fetch_status=0   
       begin  
         set @ConditionStr=@ConditionStr+'A.'+@FieldStr+'=T.'+@FieldStr+' And '  
         set @OneKeyF=@FieldStr  
         Fetch Next from Enum_PrimaryKey into @FieldStr  
       end  
       close Enum_PrimaryKey  
       deallocate Enum_PrimaryKey  
       
       Set @ConditionStr=substring(@ConditionStr,   1,len(@ConditionStr)-3)  
       
         declare @UpdateStr nvarchar(4000)---产生的更新语句  
          declare @InsertStr nvarchar(4000)---产生的插入语句  
         Set @updateStr=' update '+@DestTable  
                        +' Set '+ @SetStr  
                        +' from '+@DestTable+' A ,'+@SourceTable+' T'  
                        +' where '+@ConditionStr  
         Set @InsertStr=' insert into '+@DestTable +  
                        +' ('    +@ListFStr +' )'  
                        +' select '+@ListTstr+' from '  
                        +@SourceTable+' T left outer join '+@DestTable+' A ON '  
                        +@ConditionStr  
                        +' where A.'+@OneKeyF  
                        +' is null and not (T.'+@OneKeyF+' is Null)'  
        /*找出存在与a表中,但不在b表中的a数据记录  
        select a.* from multdid_temp a LEFT OUTER join multdid b on   
        a.did1=b.did1 and a.did2=b.did2   
        where b.did1 is NULL and not (a.did1 is NULL)  
        */  
          print @updateStr       Exec(@updateStr)  
           select @error=@@error   
           set @ErrorId=103605 
           if @error<>0 goto error            print @InsertStr    
          Exec(@InsertStr)  
           Select @error=@@error   
           set @ErrorId=103606
           if @error<>0 goto error     
        end --End of Flags=1  
       /*  
         update Atable     string1  
         set col1=T.col1,--//过滤did字段  
             col2=T.col2,  
             col3=T.col3,  
             ...........  
       from Atable A,tempAtable T   
       where              //string2    
            A.Key1=T.Key2   
       and   
            A.key2=T.key2  
       and*/  
      commit tran  
      return       error:     
      rollback transaction       
      exec insert_tracelog_pro '存储过程出错', @error, ' ', 'R_ImportTable'      
      raiserror (@error, 16, 1)      
      return isnull(@ErrorId,-1)    
    end
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO