CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

高分求解,怎么能动态的修改数据?

楼主Jazzlover(强)2001-08-10 13:58:12 在 MS-SQL Server / 基础类 提问

遇到一个问题,有两张结构相同的表,要用其中一张的数据更新另外一张,我不想用硬码写死,如:update   t1   set   c1=t2.c1,c2=t2.c2   from   t1   inner   join   t2   on...  
  我想以动态方式,用一种方法可以不知道它们的字段名(只知道关键字),怎么办?  
  意思是这样:   update   t1.*=t2.*   where   t1.key=t2.key.(只了解关键字就够了)。  
  谢谢! 问题点数:90、回复次数:13Top

1 楼rjcludy()回复于 2001-08-10 14:58:07 得分 0

用:   delete   t1   where   t1.key   in   (select   key   from   t2)  
    再   insert   into   t1(select   *   from   t2)  
  Top

2 楼hailong525(风云)回复于 2001-08-10 15:01:05 得分 0

同意楼上的!但要加上begin   ...   end;    
  begin  
  delete   t1   where   t1.key   in   (select   key   from   t2);  
  insert   into   t1(select   *   from   t2);  
  end;  
  注每个sql之后都有;  
  Top

3 楼Jazzlover(强)回复于 2001-08-10 15:08:31 得分 0

请问,这样的话出错怎么办?比如第一句执行了而第二句失败了我岂不是很惨?不安全。Top

4 楼Jazzlover(强)回复于 2001-08-10 15:09:52 得分 0

我想要的是   update   实现,谢谢。Top

5 楼rjcludy()回复于 2001-08-10 15:11:13 得分 0

to   Jazzlover(强)  
  要是出错用:   rollback;  
  这样数据就不会丢Top

6 楼hailong525(风云)回复于 2001-08-10 15:14:17 得分 0

在begin...end;之间的所有sql语句是作为一个事务提交的!Top

7 楼Jazzlover(强)回复于 2001-08-10 15:25:04 得分 0

我在存储过程中用   begin   tran   t1...end   tran   t1.编译通过但执行出错,可能因为我是对linked   server操作,出的错为   sqloledb   无法启动分布式服务。  
  而且,我想要的是象   vb   中这样的等价:  
  For   Each   fld   In   Flds  
          Debug.Print   fld.Name  
          Debug.Print   fld.Type  
  Next  
  即可以遍历但不需要名称,谢谢。Top

8 楼yao_kai(yao_kai)回复于 2001-08-10 15:45:28 得分 0

用TriggerTop

9 楼Jazzlover(强)回复于 2001-08-12 18:02:11 得分 0

to   yao_kai(yao_kai):  
      老大,不要骗我好不好。Top

10 楼guo(itpub.net)回复于 2001-08-12 18:42:11 得分 90

执行分布式事务要在各节点上启动dtc(distributed   transaction   coordinator)程序或服务  
   
  你的问题有两种解决办法:  
  1.你不想写sql语句,但为了sql运行速度着想还是应该写成硬代码,方法如下  
  set   nocount   on  
  declare   @stb   varchar(10),@dtb   varchar(10)  
  set   @stb='source   table'  
  set   @dtb='destination   table'  
   
  select   'create   proc   refresh'+@dtb+'   as   update   '+@dtb+'   set   '  
  select   'a.'+name+'=b.'+name   from   syscolumns   where   id=object_id(@dtb)   order   by   colid  
  select   'from   '+@dtb+'   a,   '+@stb+'   b   where   a.key=b.key'  
  将query   analyzer中运行后的结果拷贝后再运行就会创建一个存储过程refresh<tablename>它会完成对表的刷新任务.  
  2.在一些情况下如源表在小字段变化而大字段没有变化时,系统资源浪费严重,建议使用复制完成这种任务.  
  Top

11 楼pxq(风轻轻地吹)回复于 2001-08-12 19:16:21 得分 0

可以用  
  declare   varchar(1000)   sql,varchar(100)   key  
  set   key   =   'keyField'  
  Set   sql   =   'update   t1.*   =   t2.*   '   where   t1.'   +   key   +   '=   t2.'   +   key  
  execute   (   sql   )  
   
  大致可以使用这种方法,自己试试。  
  Top

12 楼clarain(clarain)回复于 2001-08-13 09:19:00 得分 0

To     Jazzlover(强)  
  好像没有用update实现insert   into   t1(select   *   from   t2)的方法!  
  因为Update需要一一对应才可以!Top

13 楼dragonerfish(jimmyyu)回复于 2001-08-13 14:56:45 得分 0

关注!!!Top

相关问题

  • 继续求解:关于数据修改的问题
  • 【50分求解】为动态列绑定动态的数据字段
  • edit.asp的页面,不能自动更新已经修改的数据,求解决!
  • 如何动态修改数据管道?
  • 动态修改数据源的问题
  • 数据窗口动态修改?
  • 数据库字段的动态修改。
  • 怎样动态更新数据控件?快快求解?进者有分
  • ###100分求解### syntaxfromsql动态创建数据窗口,参数如何设置?
  • 高分求解动态SQL

关键词

  • 数据
  • 执行
  • sql
  • dtb
  • fld
  • stb
  • 出错
  • 方法
  • key
  • update

得分解答快速导航

  • 帖主:Jazzlover
  • guo

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo