begin tran
   delete...
   if @@error<> 0 rollback
   insert ...
   if @@error<> 0  rollback
   commit

解决方案 »

  1.   

    insert into table_target select * from table_source 這條語句沒問題嗎?
    我想應該這樣寫吧
    select * into table_target from table_source
      

  2.   

    可以用sunrisehy2003(黎明) 的方法试试看,如果不行就是你的sql server的配置问题了,把你的机器配置和sql server配置贴出来看看。
      

  3.   

    --在查询分析器中用下面的方法就可以解决
    --注意,有一定危险性,使用前先备份alter database 你的数据库名 set recovery BULK_LOGGED 
    goinsert into table_target select * from table_source 
    goalter database 你的数据库名 set recovery full
    go
      

  4.   

    请教zjcxc(邹建) ,你好,我不明白你2次 ALTER DATABASE 有什么目的和好处吗?多谢!!
      

  5.   

    控制資料庫復原選項。 RECOVERY FULL | BULK_LOGGED | SIMPLE 
    若是指定 FULL,則會提供完全的保護來防止媒體錯誤的發生。如果資料檔毀損,則媒體復原可回復所有認可的交易。 
    若是指定 BULK_LOGGED,則對於某些大範圍或大量作業而言,保護措施以避免媒體錯誤會結合最佳效能與最少記錄記憶體用量。這些作業包括 SELECT INTO、大量負載作業 (bcp 和 BULK INSERT)、CREATE INDEX 以及文字和影像作業 (WRITETEXT 和 UPDATETEXT)。在大量記錄復原模型之下,整體類別 (Class) 的記錄最小,無法以作業基礎來控制作業。若是指定 SIMPLE,則提供使用最少記錄空間的簡單備份策略。當伺服器故障復原不再需要記錄空間時,會自動重複利用此空間。重要事項  簡單復原模型比其他兩種模型更容易管理,但是如果資料檔毀損,其資料遺失的風險較高。所有最近資料庫的變更或差異式資料庫備份若都遺失,則必須手動重新輸入。預設的復原模型取決於 model 資料庫的復原模型。若要變更新資料庫的預設值,請使用 ALTER DATABASE 來設定 model 資料庫的復原選項。
      

  6.   

    忘了说明一点,我是从DB2导数入SQLSERVER,一方面DB2对我而言是远程链接服务器,我以前有个帖子说过我在做分布式事务时总出错,因此,我不再使用commit 和 rollback 语句
    另一方面,我导数的目标数据库,有几十个用户在同时操作,取数查询,sqlserver是专做查询用的。
    可以使用 insert into 目标表 select * from ..源表 ,但内存占用太大,我把我的语句贴出,看有什么办法可提高性能
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GOALTER        proc usp_cw_f0411
    as
    ----------------------------------
    --更新应付F0411
    ------------------
    DECLARE @adt_bgn datetime  --前推日期
    declare @adt_end datetime  --当前日期
    declare @ai_bgn  int    --前推日期对应的数值
    declare @ai_end  int    --当前日期对应的数值
        
    set @adt_bgn = dateadd(day, -30,getdate())
    set @adt_end = getdate()
    set @ai_bgn = 
    (year(@adt_bgn)/100 - 19 )*100000 + ( year(@adt_bgn) - floor(year(@adt_bgn)/1000)*1000 )*1000 +
    datediff(day, (convert(char(4),year(@adt_bgn))+'/01/01 00:00' ),@adt_bgn) + 1
    set @ai_end = 
    (year(@adt_end)/100 - 19 )*100000 + ( year(@adt_end) - floor(year(@adt_end)/1000)*1000 )*1000 +
    datediff(day, (convert(char(4),year(@adt_end))+'/01/01 00:00' ),@adt_end) + 1
    --set @ai_bgn  = DATEDIFF( DAY, '2003/7/31' , @adt_bgn ) + 103212
    --set @ai_end  = DATEDIFF( DAY, '2003/7/31' , @adt_end ) + 103212
    while @ai_bgn <= @ai_end
      begin
    --    begin tran t_f0411    delete from F0411
        where datediff(day,RPDSVJ,@adt_bgn) =0     if @@error <> 0 
        begin
    --     rollback tran t_f0411
         insert into daily_alter
         values('f0411', getdate() , @adt_bgn , @@error )
         return
        end insert into F0411
    SELECT   A.RPKCO,   
             A.RPDOC,   
             A.RPDCT,   
             A.RPSFX,   
             A.RPAN8,   
             CASE 
             WHEN A.RPDIVJ >50000 THEN
             dateadd(day ,( RPDIVJ - floor(RPDIVJ/1000)*1000 - 1  )   ,
             convert(datetime,convert(char(4),1900 + floor(RPDIVJ/1000) )+'/01/01 00:00')) 
             else convert(datetime,'1950/1/1') 
             END AS 'RPDIVJ',    
             CASE
             WHEN A.RPDSVJ > 50000 THEN
             dateadd(day ,( RPDSVJ - floor(RPDSVJ/1000)*1000 - 1  )   ,
             convert(datetime,convert(char(4),1900 + floor(RPDSVJ/1000) )+'/01/01 00:00')) 
             else convert(datetime,'1950/1/1') 
             END AS 'RPDSVJ',          CASE 
             WHEN A.RPDDJ > 50000 THEN
             dateadd(day ,( RPDDJ - floor(RPDDJ/1000)*1000 - 1  )   ,
             convert(datetime,convert(char(4),1900 + floor(RPDDJ/1000) )+'/01/01 00:00')) 
             else convert(datetime,'1950/1/1') 
             END AS 'RPDDJ',  
     
             A.RPICU,   
             A.RPICUT,            CASE
             WHEN RPDICJ > 50000 THEN
             dateadd(day ,( RPDICJ - floor(RPDICJ/1000)*1000 - 1  )   ,
             convert(datetime,convert(char(4),1900 + floor(RPDICJ/1000) )+'/01/01 00:00')) 
             else convert(datetime,'1950/1/1') 
             END AS 'RPDICJ', 
             A.RPPST,   
             A.RPAG/100.00,   
             A.RPAAP/100.00,   
             A.RPCRCD,   
             A.RPPOST,   
             A.RPRMK ,
             A.RPGLC ,
             A.RPRP3 ,
             A.RPPO  ,
             A.RPDCTA
       FROM JDE..PRODDTA.F0411 A 
       where rpdsvj = @ai_bgn   if @@error <> 0 
        begin
    --     rollback tran t_f0411
         insert into daily_alter
         values('f0411', getdate() , @adt_bgn , @@error )
         return
        end 
      else
        begin
    --      commit tran t_f0411
          insert into daily_alter
          values('f0411', getdate() , @adt_bgn , @@error )
        end    set @adt_bgn = dateadd(day,1,@adt_bgn)
    --  set @ai_bgn = @ai_bgn + 1
        set @ai_bgn = 
       (year(@adt_bgn)/100 - 19 )*100000 + ( year(@adt_bgn) - floor(year(@adt_bgn)/1000)*1000 )*1000 +
        datediff(day, (convert(char(4),year(@adt_bgn))+'/01/01 00:00' ),@adt_bgn) + 1endGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO