如何用臨時表代替游標進行表記錄的拷貝

2021-09-07 22:23:41 字數 2946 閱讀 8246

在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.建立一...