在sql中,有時候游標並不能實現所有的迴圈操作,比如當雙重迴圈時,內層重複定義動態游標就是sql語法所不允許的.
下面介紹一種利用臨時表替代游標的方法.
usetest
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)
gocreate
table
tb (
id uniqueidentifier
primary
key,
ta_id
uniqueidentifier
foreign
keyreferences
ta(id),
claim
decimal(18
,2), claim_date
datetime
notnull
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
>
10go
--對每個#ta_temp 裡的記錄,生成乙個新的主鍵
alter
table
#ta_temp
addnew_key
uniqueidentifier
notnull
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
ona.ta_id
=b.id
go--
清理現場
drop
table
#ta_temp
go--
測試結果:
游標和臨時表
臨時表和游標的使用小總結 最近使用db的機會比較多,現做了一些小總結 i。臨時表 臨時表與永久表相似,但臨時表儲存在 tempdb 中,當不再使用時會自動刪除。臨時表有區域性和全域性兩種型別 2者比較 區域性臨時表的名稱以符號 打頭 僅對當前的使用者連線是可見的 當使用者例項斷開連線時被自動刪除 全...
儲存過程,游標,迴圈,臨時表
create procedure hr attabn qry2 d date nvarchar 10 null,deptno nvarchar 1000 null as begin declare sql nvarchar 1000 建立臨時表 create table mytemptable de...
oracle游標 臨時表使用練習
1.建立一張會話級的臨時表 create global temporary table pact test pact id varchar2 100 pact code varchar2 100 pact name varchar2 800 on commit preserve rows 2.建立一...