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

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

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

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/p/1718755.html