在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
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