如何用临时表代替游标进行表记录的拷贝

在sql中,有时候游标并不能实现所有的循环操作,比如当双重循环时,内层重复定义动态游标就是sql语法所不允许的.

下面介绍一种利用临时表替代游标的方法.

ExpandedBlockStart.gif sql代码
use  test 
go  

--  假设有个table, TA, TB 
create   table  TA 

        id 
uniqueidentifier   primary   key
        name 
varchar ( 10 ), 
        age 
int  

go  

--  插入一些测试数据 
insert  TA (id, name, age)  values  ( ' 675BEB41-E5DC-4688-B317-CA0BD5A58961 ' ' 张三 ' 20
insert  TA (id, name, age)  values  ( ' EF6358BE-0658-488B-94D7-38507782C8DE ' ' 李四 ' 15
go  

create   table  TB 

        id 
uniqueidentifier   primary   key
        TA_id 
uniqueidentifier   foreign   key   references  TA(id), 
        claim 
decimal ( 18 , 2 ), 
        claim_date 
datetime   not   null   default ( getdate ()) 

go  

--  插入一些这些人的测试报销数据 
insert  TB (id, TA_id, claim, claim_date)  values  ( newid (),  ' 675BEB41-E5DC-4688-B317-CA0BD5A58961 ' 300 ' 2010-03-01 '
insert  TB (id, TA_id, claim, claim_date)  values  ( newid (),  ' 675BEB41-E5DC-4688-B317-CA0BD5A58961 ' 150 ' 2010-04-05 '

insert  TB (id, TA_id, claim, claim_date)  values  ( newid (),  ' EF6358BE-0658-488B-94D7-38507782C8DE ' 50 ' 2010-02-23 '
insert  TB (id, TA_id, claim, claim_date)  values  ( newid (),  ' EF6358BE-0658-488B-94D7-38507782C8DE ' 350 ' 2010-03-15 '
insert  TB (id, TA_id, claim, claim_date)  values  ( newid (),  ' EF6358BE-0658-488B-94D7-38507782C8DE ' 412 ' 2010-04-10 '

--  现在要复制所有age > 10 的数据及其附表数据。 
select   *   into  #ta_temp  from  TA 
--  假设有某个条件: 
where  age  >   10  
go  

--  对每个#ta_temp 里的记录,生成一个新的主键 
alter   table  #ta_temp 
add  new_key  uniqueidentifier   not   null   default ( newid ()) 
go  

--  测试一下: 
--
select * from #ta_temp 

--  现在插入要拷贝的这些主表记录 
insert  TA (id, name, age) 
select  new_key, name  +   ' 拷贝 ' , age 
from  #ta_temp 

--  现在对#ta_temp 中的每条主表记录找到对应的附表记录, 
--
 并对应到新主键,插入从表 
insert  TB (id, TA_id, claim, claim_date) 
select  
        
newid (), 
        b.new_key, 
        a.claim, 
        a.claim_date 
from  TB a  inner   join  #ta_temp b 
        
on  a.TA_id  =  b.id 
go  

--  清理现场 
drop   table  #ta_temp 
go  

--  测试结果: 
select   *   from  TA 
select   *   from  TB 
go

 

转载于:https://www.cnblogs.com/davidgu/archive/2010/04/23/1718755.html

猜你喜欢

转载自blog.csdn.net/weixin_33692284/article/details/93802704