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