a feladat az lenne, hogy ez nagyon gyors legyen
:)
create table t (id int, mezo varchar(max) null, tip int)
create table tt (id int, tip int, mezo varchar(max), nev varchar(max))
insert into tt Select 1,1,'a','n1'
insert into tt Select 2,1,'b','n2'
insert into tt Select 3,1,'c','n3'
insert into tt Select 4,1,'d','n4'
insert into tt select 5,2,'G','n1'
insert into tt select 6,2,'H','n3'
insert into tt select 7,2,'I','n4'
insert into t select 1,null,1
insert into t select 2,null,2
insert into t select 3,null,2
insert into t select 4,null,1
create clustered index i1 on tt (tip, id)
go
create function gm(@tip int) returns varchar(max)
as
begin
declare @ret varchar(max)
select @ret = isnull(@ret,'') + Nev+':'+Mezo+','
from tt where tip = @tip
return @ret
end
go
-- update t set mezo = null
update a
set mezo = dbo.gm(tip)
from t as a
select * from t
/*
id mezo tip
1 n1:a,n2:b,n3:c,n4:d, 1
2 n1:G,n3:H,n4:I, 2
3 n1:G,n3:H,n4:I, 2
4 n1:a,n2:b,n3:c,n4:d, 1
*/
ami miatt most lassu
, az az hogy a tt az igazabol egy
view ami tobb adatbazisban levo azonos tablakat fog ossze valahogy igy:
create view tt
as
select * from db2000.dbo.tt
union all
select * from db2001.dbo.tt
union all
select * from db2002.dbo.tt
...
select * from db2009.dbo.tt
ezek a tablak nagyok
(2-3
millio rekord tablankent)
nekem keves rekordhoz tartozo adat kell
(a T tablaba par ezer rekord van,
tehat a TT-bol par tizezer rekord kell csak osszesen)
DE en tudom
, hogy melyik evekbol kene az adat
(mert altalaban csak 1-2
egymast koveto evrol van szo pl 2005+2006)
DE fgvben nem lehet dinamikus sqlt hasznalni
.:(
tehetnek bele egy nagy
IF et hogy melyik evekbol kerek adatot:
if
ev = 2000
select
.... from db2000...
else
if ev
= 2001
select
.... from db2001...
de ezzel meg az a baj
, hogy amikor uj ev nyilik,
akkor modositani kene ezt a fgvt is
(
ami perpill nem megy automatikusan, mig az uj ev nyitasa automatikusan megy,
persza ha as nincs,
akkor megoldjuk hogy modosuljon ez a fgv uj ev nyitasakor...)
Gyakorlatilag a feladat sorok kifektetese es osszefuzese egyetlen mezobe sok rekordon
:)
mert ha ez menne
:
update
a
set
mezo = a.mezo
+ b.nev+':'+b.mezo+','
from
t as a
join
tt as b
on t.tip
= tt.tip
akkor minden jo lenne
:) de ez csak ugye az elso rekordot teszi bele,
nem fuzi hozza a tobbit.
(
mert ezt meg tudom irni dinamikus SQL-re
(a TT helyett dbXXXX)
magaban az eljarasban ami amugy hivogatna a fgvt)
Potyos