如何将检索到的结果传给SQL的临时表?

http://topic.csdn.net/t/20050403/20/3905378.html

如何将检索到的结果传给SQL的临时表?

楼主JERRY_LIU(formulas) 2005-04-03 20:40:32 在 .NET技术 / VB.NET 提问

我在vb.net内的datagrid内修改了n行记录,将修改过的记录挑选出来后,想更新sql里的table,有人建议我先存在临时表里面,再转存入 真正的table里,如果用insert   将记录一行一行存入临时表的话,如果有十行不是要执行十次存储过程?有没有更简单有效的方法?  
  然后,临时表的数据是否可以用一句update的语句来更新?还是也得一行一行确认ID后再update? 问题点数:20、回复次数:7Top

1 楼harryho(基路亚)回复于 2005-04-03 22:36:45 得分 7

如果你是用SQL   SERVER的话,我建议用TRIGGER.用TRIGGER的话就有一个甘样的表INSERTED专门来用存放你修改和插入表的记录.你可以用这个表的记录去更新你的TABLE.  
   
  create   trigger   trigger_name     on   table_name    
  for   update,insert   as  
  update   table   set   字段名=     from   inserted   where   ....  
   
   
  Top

2 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 08:28:22 得分 7

存储进临时表如果使用存储过程自然要有多少条记录循环调用多少次。但最后更新进table中可以使用一条sql语句,insert   into   table_name   select   #temp_table.name,#temp_table.age等Top

3 楼terryshi(terryshi)回复于 2005-04-04 08:34:31 得分 0

select   *   into   #temp_table   form   AAAA  
  临时表的定义和普通表是一样的,不同的是在访问结束后会自动删除  
  #XX表示局部临时表,一次查询后删除。  
  ##XX表示全局临时表,一次连接后删除,差不多是SqlConnection.Close()。Top

4 楼JERRY_LIU(formulas)回复于 2005-04-04 09:36:48 得分 0

TO:   hamadou(闵峰)    
  因为我的记录有可能几条是修改原资料,有几条是新增的,所以当我从临时表中往数据库里更新时,不能一条INSERT搞定。(我现在的想法是在vb.net里通过datarow.rowstate来判断)  
   
  将记录存入临时表时,在.net下用sqlcommand执行存储过程,一个过程用来新建临时表,另一个用来新增记录,如果有十条记录那我就得执行sqlcommand.ExecuteNonQuery()十次?  
  我还担心我建立的是局部临时表,会不会当我执行第二次sqlcommand时,该表就不存在了?  
   
  TO:    harryho(基路亚)    
  触发器还没用过,正在学习中,谢谢你的回覆Top

5 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 09:43:50 得分 0

可以判断行状态,或者使用dataview(取得是added的行),一般来说如果想往临时表里插入,就得一行一行做了。所以有多少次就要调多少次,有10条就要执行10次。临时表的使用见  
  terryshi(terryshi)   所说。Top

6 楼foxbuilder(狐思乱想)回复于 2005-04-04 10:04:30 得分 6

一般来说,有使用临时表和使用触发器两种方法.  
  个人认为,触发器使用起来更简单,   但对于复制更新(如需根本每条记录处理不同的逻辑代码往往太复杂,所以我一般采用临时表.    
  对于你所说的问题  
   
  q:  
  因为我的记录有可能几条是修改原资料,有几条是新增的,所以当我从临时表中往数据库里更新时,不能一条INSERT搞定。(我现在的想法是在vb.net里通过datarow.rowstate来判断)  
   
   
  a:   所谓更新,其实包括(新增,修改,删除),   datarow.RowState   可以记录可以反映行的状态是(已新增,已修改,或已删除),   临时表结构,除了依照源表的结构的结构外,我自己另外加一了个nRowState(smallint)类型的字段,用以在临时表中保存每一行的 RowState.  
   
        此种方法需要注意一点,你遍历每一个datarow的时候,你会发现DataState为Deleted的行并不能被你直接访问,   此时我采取的方法是  
   
       
      If   dr.RowState   =   DataRowState.Deleted   Then  
                          IsDelete   =   True  
                          dr.RejectChanges()  
        End   If  
        在临时表中加入此行  
        If   IsDelete   Then  
                  dr.Delete()  
        End   If    
   
   
  q:  
  将记录存入临时表时,在.net下用sqlcommand执行存储过程,一个过程用来新建临时表,另一个用来新增记录,如果有十条记录那我就得执行sqlcommand.ExecuteNonQuery()十次?  
  我还担心我建立的是局部临时表,会不会当我执行第二次sqlcommand时,该表就不存在了?  
   
  a:    
  dim   conn   sqlconnection   =   getconn()  
  ...  
  sqlcommand.ExecuteNonQuery(...)   '建立临时表  
  dim   dr   as   datarow  
  for   each   dr   in   dt.rows  
          sqlcommand.ExecuteNonQuery(...)   '插入每行至临时表中....  
  end   for    
   
  保证每次的sqlcommand使用的是同一个连接.   临时表都会有效.  
   
  至于调用效率,我觉得大可不必担心,   一次几十上百条记录应该是不会有太大感觉的.  
   
   
   
   
   
   
   
   
   
   
  dim   conn   as   sqlconnection   =   getconn    
   
  Top

7 楼JERRY_LIU(formulas)回复于 2005-04-04 14:36:21 得分 0

如果按照foxbuilder的说法,当一行被删除时,先在临时表中删除该行,再从临时表导入原TABLE,等于是先把所有记录读入临时表,再把要删除的记录删掉,最后操作完后,将整个临时表的记录去覆盖原TABLE的全部记录.  
   
  如果表的记录不多还好,如果有上万条,这样不好吧。  
   
  如果我只提取被ADD,UPDATE,DELE的记录ID,直接存入原TABLE,不是少了一个中间环节?为什么要用临时表来中转? 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值