用存储过程:begin transupdate b set col1=a.col1,col2=a.col2,... from a,b where a.主键A=b.主键A and a.传输标志=1 if @@error<>0 begin rollback trans return endinsert b(...) select ... from a where 传输标志=1 and not exists ( select * from b where 主键A=a.主键A ) if @@error<>0 begin rollback trans return endupdate a set 传输标志=0 where 传输标志=1 if @@error<>0 begin rollback trans return end commit trans哈,哈哈,哈哈哈......
create proc 过程名 @原表名 varchar(1000), @目标表名 varchar(1000), @主键列名 varchar(1000) as exec('insert '+@目标表名+' select * from '+@原表名+' where '+@主键列名+'not in (select '+@主键列名+' from '+@目标表名+')')
update 表A set 传输标志=0
set col1=a.col1,col2=a.col2,...
from a,b
where a.主键A=b.主键A
and a.传输标志=1
if @@error<>0
begin
rollback trans
return
endinsert b(...)
select ... from a
where 传输标志=1
and not exists (
select * from b
where 主键A=a.主键A
)
if @@error<>0
begin
rollback trans
return
endupdate a
set 传输标志=0
where 传输标志=1
if @@error<>0
begin
rollback trans
return
end
commit trans哈,哈哈,哈哈哈......
先删后添是一个办法,但我认为这们会给数据库添加很大的负担!
例如我要更新10万条数据,那么就要先delete10条数据,再insert10万条数据?
这样做并不太好吧?
另我想知道您是从那一本书上看到过的?
因为我想把这个小程序做成通用的
也就是说表1与表2可以是任意选择!那么用存储过程不太实际!
@原表名 varchar(1000),
@目标表名 varchar(1000),
@主键列名 varchar(1000)
as
exec('insert '+@目标表名+' select * from '+@原表名+' where '+@主键列名+'not in (select '+@主键列名+' from '+@目标表名+')')
select * into from
因为我想把小程序做成两个表之间的数据传输。
表与字段都是可选择的!
因为考虑到有可能表A与表B的字段名、类型都是可选的
也就是说
表A.x->表B.y
x与y的名字与类型有可能不一样哟!还有在表中所处的位置也不一样哟!