高分求解,怎么能动态的修改数据?
遇到一个问题,有两张结构相同的表,要用其中一张的数据更新另外一张,我不想用硬码写死,如: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




