Avatar billede trer Nybegynder
30. juli 2005 - 16:27 Der er 4 kommentarer og
1 løsning

DTS og pivot tabeller

Hej

Jeg har en DTS pakke i SQL Server 2000 som importerer en tekstfil ind i en tabel - importen er et "deltaload" hvor nogle få tusinde rækker indlæses, konverteres og tilføjes en tabel med flere millioner rækker.

I tekstfilen findes et felt med "gentagne" værdier som jeg skal have pivoteret og lagt over i en separat tabel.  Der er ikke samme antal gentagne værdier i hver række og jeg behandler dem alligevel via en ActiceX transform.

Ex på tekstfil:
"1","yyy aaa bbb",bla,bla,bla,
"2","bbb ccc ddd eee fff",bla,bla,,
"3","uuu aaa",bla,bla,bla,bla

Over i tabel A på SQL Server
1,"yyy aaa bbb",bla,bla,bla,
2,"bbb ccc ddd eee fff",bla,bla,,
3,"uuu aaa",bla,bla,bla,bla

og i tabel B på SQL Server
1,"yyy"
1,"aaa"
1,"bbb"
2,"bbb"
2,"ccc"
2,"ddd"
2,"eee"
2,"fff"
3,"uuu"
3,"aaa"

Det er et krav at pivoteringen sker direkte i DTS pakken i forbindelse med importen og ikke ved at bearbejde tabellen med mange millioner records efterfølgende (og ej heller ved at indføje en ekstra staging tabel og loope gennem den - en sådan løsning er nem nok at kode).

DTS pakken består af en connection af typen "DTSflatfile" til indlæsning af tekstfilen, et transformer stage til konvertering/fortolkning (inkl. noget lookup) og så et alm. sqloledb connection for at få data ind i databasen.

Så hvordan koder jeg et "ekstra" transformer stage som jeg kan koble på de to eksisterende connections - og som håndterer pivoteringen når der er forskelligt antal gentagne værdier i hver række?

(Måske kunne udgangspunktet være et ActiveXtransform script som laver en split af min tekststreng a la

sub Main()
  Dim A
  A = split (DTSsource("kol2")," ")
  ' A indeholde nu array med værdier
    ?!?
end sub

Men så skal jeg på en eller anden måde have indsat hver værdi af A i sin egen række i DTSdestination - og det kan jeg ikke finde ud af... )
Avatar billede ldanielsen Nybegynder
09. august 2005 - 08:03 #1
Jeg ville bruge ADO i ActiveX-scriptet. Så er det let nok at styre det.

Men du er måske ikke vant til ADO? Det er det alle vi asp-nørder bruger hele tiden.
Avatar billede trer Nybegynder
09. august 2005 - 18:29 #2
Jeg har faktisk haft prøvet at lave en ekstra ADODB connection og kørt det den vej igennem.

Problemet er, at ActiveX scriptet kaldes pr række i source - så man får en hulens masse connect/disconnect for at overføre få rækker ad gangen (med mindre man kan gemme et connection-object i en global DTS variabel, det har jeg ikke prøvet).

Men det værste er, at man går fra at lave bulk-operationer til enkeltstående inserts - og det sætter performance ned i gulvhøjde.

mvh
Troels
Avatar billede trer Nybegynder
23. august 2005 - 10:40 #3
Hej LDanielsen

Selvom jeg havde været gennem dit løsningsforslag så er det det eneste indkomne - så jeg synes du skal have noget for ulejligheden.

Smid et svar og vi deler i porten.
Avatar billede ldanielsen Nybegynder
23. august 2005 - 13:51 #4
Næ, det er for lidt til at få point for. Jeg ville have uddybet det, men det var vist ikke nødvendigt.

Så ingen point til mig ...
Avatar billede trer Nybegynder
23. august 2005 - 14:30 #5
Du var ellers velkommen - jeg giver lidt god karma i stedet.

I øvrigt prøvede jeg med et ADO connection objekt gemt i en global variabel (af typen variant) efter dit indlæg. Performance steg en smule men desværre stadig ikke nok...

Så nu overvejer jeg at tilføje en rowversion kolonne med et clustered indeks til min tabel og ud fra den finde nys-indsatte kolonner som jeg så pivoterer enten via en SP eller via et eksternt program.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester