Sunteți pe pagina 1din 5

Prelucrarea datelor cu caracter temporar

Tabele temporare
Tabelele temporare sunt obiecte create de utilizator pentru prelucrarea datelor cu caracter
temporar. Tabelele temporare sunt prelucrate similar tabelelor permanente relativ la
comenzile CREATE TABLE, SELECT, INSERT, U!ATE, !ELETE, !R" TABLE.
!e asemenea sunt posibile opera ii ca inde#area, ad$u%area sau eliminarea de coloane.
Sinta#a CREATE TABLE accept$ de&ini ii de constr'n%ere cu e#cep ia constr'n%erilor
de tip ("REI)N *E+.
Tabele temporare sunt create ,n baza de date de sistem TempDb, special creat$ de S-L
Server ca s$ o&ere spa iu de lucru pentru diverse obiecte temporare precum tabele
temporare i proceduri stocate temporare. TempDb este o baz$ de date de sistem similar$
bazelor de date aplicative, cu di&eren a c$ datele stocate nu sunt persistente. "biectele
create ,n TempDb sunt automat eliminate c'nd sesiunea clientului curent se termin$.
E#ist$ dou$ tipuri de tabele temporare.
Tabele temporare locale, create cu pre&i#ul /. !omeniul lor de aplicare este limitat la
sesiunea curent$ a utilizatorului care le0a creat. Acest lucru ,nseamn$ c$ ,n sesiuni
1scripturi2 di&erite pot &i create tabele temporare cu aceea i denumire 1unicitatea &iind
asi%urat$ prin asocierea unui num$r de identi&icare2.
Tabele temporare globale, create cu pre&i#ul //. Un ast&el de tabel este vizibil din orice
sesiune. Nu pot e#ista dou$ tabele temporare %lobale cu aceea i denumire.
Tabelul temporar %lobal va &i distrus c'nd sesiunea de re&erin $ ,n care a &ost creat este
,nc3is$ i toate procesele care ,l re&er$ sunt terminate.
E#emplu de utilizare a tabelelor temporare locale.
use dbFacturare
create table #Clienti
(codClient char(10),nrFacturi int default 0)
insert into #Clienti values('100',0)
insert into #Clienti(codClient) values('101')
update #Clienti
set nrFacturi=(select COUN(NrFact) fro! tFacturi
"here CodClient=#Clienti#codClient)
select $ fro! #Clienti
E#emple de utilizare a tabelelor temporare %lobale.
42
use dbFacturare
if ob%ect&id('te!pdb#dbo###Centrali'atorFacturi') is not null
drop table ##Centrali'atorFacturi
create table ##Centrali'atorFacturi
(nrFact char(10) pri!ar( )e(,
CodClient char(10),
*alFact nu!eric(+,,)
)

insert into ##Centrali'atorFacturi
select tFacturi#nrfact, codClient, -U.(Cantitate$pret)
fro! tFacturi inner %oin t/etaliiFact
on tFacturi#nrFact=t/etaliiFact#NrFact
inner %oin t0roduse
on t/etaliiFact#Cod0rod=t0roduse#Cod0rod
1roup b( tFacturi#NrFact,CodClient
select $ fro! ##Centrali'atorFacturi
sau
if ob%ect&id('te!pdb#dbo###Centrali'atorFacturi') is not null
drop table ##Centrali'atorFacturi
select tFacturi#nrfact, codClient, -U.(Cantitate$pret)as valoare
into ##Centrali'atorFacturi
fro! tFacturi inner %oin t/etaliiFact
on tFacturi#nrFact=t/etaliiFact#NrFact
inner %oin t0roduse
on t/etaliiFact#Cod0rod=t0roduse#Cod0rod
1roup b( tFacturi#NrFact,CodClient
select $ fro! ##Centrali'atorFacturi
52 Numerotarea randurilor
drop table ##Clienti
select 2/3N24(int,1,1) as NrCrt,
Cod5udet,6ocalitate, Nu!e
into ##Clienti
fro! tClienti
order b( Cod5udet,6ocalitate, Nu!e

select NrCrt,Cod5udet,6ocalitate,Nu!e,NrCrt
fro! ##Clienti
Observatie. In baza de date de sistem Tempdb, pot &i create i tabele permanente 1care nu
sunt eliminate automat la terminarea cone#iunii utilizatorului cu baza de date2.
entru aceasta, comanda va &i ca mai 6os.
42
create table te!pdb#dbo#t1(7 int)
52
create table te!pdb##t,(7 int)
72
use te!pdb
create table t8(7 int)
Eliminarea acestor tabele se poate &ace prin utilizarea e#plicit$ a comenzii !R"
TABLE.
drop table te!pdb#dbo#t1
drop table te!pdb#dbo#t,
drop table te!pdb#dbo#t8
Variabile de tip tabel
8ncep'nd cu S-L Server 5999, :icroso&t a introdus un nou tip de date. variabile de tip
tabel, ca o alternativ$ la utilizarea tabelelor temporare. entru seturile de rezultate mici
variabilele dev tip tablou sunt mai rapide i mai &le#ibile dec't tabele temporare.
" variabil$ de tip tabel se declar$ ca ,n e#emplele urm$toare.
declare 9t table
( 7 int identit((1,1) pri!ar( )e(,
( int C:3C; (( <1000)
)
insert into 9t values (=),(+),(>)
select $ fro! 9t
# ;
4 <
5 =
7 >
declare 9t, table(cod0rod char(10),pret nu!eric(+,,))
insert into 9t, select cod0rod,pret fro! t0roduse
select cod0rod ,pret fro! 9t,
" &uncie poate returna o variabil$ de tip tabel.
create function centrali'ator()
returns 9Centrali'ator table(NrFact char(10),*aloare nu!eric(?,,))
@s
be1in
insert into 9Centrali'ator
select NrFact,-U.(Cantitate$0ret) as *aloareFacturata
fro! t/etaliiFact as @ inner %oin t0roduse as A
on @#Cod0rod=A#Cod0rod
1roup b( NrFact

return
end

1o

select $ fro! dbo#centrali'ator()
?ariabile de tip tabel sunt stocate ,n memorie i par ial stocate pe disc. !eoarece
acestea sunt par ial stocate ,n memorie, timpul de acces pentru o variabil$ tabel poate &i
mai rapid dec't timpul necesar pentru a accesa un tabel temporar.
E@RESII TABEL
" e#presie tabel 1CTE, Common Table E#pression2 poate &i considerata un set temporar
de rezultate de&init in s&era de e#ecutie a unei sin%ure comenzi SELECT, INSERT,
U!ATE, !ELETE sau CREATE ?IEA. " e#presie CTE reprezint$ un tabel virtual, in
sensul ca nu este stocat sub &orma de obiect si nu dureaza mai mult decat comanda pentru
care este de&init$.
" e#presie CTE se compune din urmatoarele elemente. un nume reprezentand e#presia
CTE, o lista &acultativa de coloane si o intero%are SELECT al c$rui set de rezultate
populeaz$ e#presia CTE. !in momentul in care e#presia CTE a &ost de&inita, se poate
&ace re&erire la ea, similar unui tabel sau vederi, intr0o comanda SELECT, INSERT,
U!ATE, !ELETE sau CREATE ?IEA.
" e#presie CTE poate &ace trimitere catre ea insasi si poate &i re&erit$ de mai multe ori in
comanda asociat$.
E#emple
42 S$ se determine clien ii pentru care num$rul de &acturi emise este mai mare dec't
media num$rului de &acturi emise la nivel de client.
"ith
C3(CodClient, nrFacturi) BB definirea expresiei tabel
as
(
select CodClient,count(NrFact) BB comanda select ce populeaz cu date
expresia CTE
fro! tFacturi
1roup b( CodClient
)
-elect C3#CodClient,nu!e,nrFacturi BB comanda care foloseste expresia tabe
(poate fi
seect, insert, update, delete)
fro! C3 inner %oin tClienti
on C3#CodClient=tClienti#CodClient
"here nrFacturiC(select @*D(nrFacturi) fro! C3)
52 E#emplu de utilizare a unei e#presii tabel ,ntr0o comand$ CREATE ?IEA
create vie" v
as
"ith
C3(CodClient, nrFacturi)
as
(
select CodClient,count(NrFact)
fro! tFacturi
1roup b( CodClient
)
select BB co!anda ce foloseste e7presia tabel
C3#CodClient,nu!e,nrFacturi
fro! C3 inner %oin tClienti
on C3#CodClient=tClienti#CodClient
"here nrFacturiC(select @*D(nrFacturi) fro! C3)
"bservatie
Clauza with poate con ine mai multe e#presii CTE separate prin vir%ula.