RulleRimfrost Skrevet 12. november 2010 Del Skrevet 12. november 2010 Jeg jobber med Sql server 2005, og skal hente data fra flere kilder til en tabell. Problemet er at jeg nå har en kildetabell som mangler integritet på id. Det finnes altså flere rader med lik id i kilden, som skal over i mål-tabellen som har UNIQUE på akkurat det feltet. Derfor feiler insert into targetTable(id, felt1, felt2) select id, felt1, felt2 from sourceTable Jeg ser for meg å loope gjennom sourceTable og benytte noen slags if not exist-logikk for å sette inn raden i targetTable. Kan noen hjelpe meg med en slik loop-funksjon jeg kan benytte i sproc'en min ? Lenke til kommentar
xibriz Skrevet 12. november 2010 Del Skrevet 12. november 2010 Ett kjapt forslag ville være å ta GROUP BY id på sourceTable, men jeg ville ikke gjort dette. Hvis du ikke trenger å ha lik id i den nye tabellen, kan du jo sette auto increment å la det fikse seg selv. Lenke til kommentar
RulleRimfrost Skrevet 12. november 2010 Forfatter Del Skrevet 12. november 2010 (endret) Det jeg omtaler som ID er egentlig organisasjonsnummer, og vil ikke være hovednøkkel i mål-tabellen min. Jeg har laget en ny id med autoincrement der. Litt senere tenkte jeg å utvide prosedyren til å også gjøre noe ved exist = true (splitte, update), så GROUP BY faller også litt ut. Finnes noen slags FOR-EACH ROW funksjon i sql? Det ville hvert trist og leit å måtte hente inn kildedataene til asp-løsningen i front for så å behandle de der... Edit : forumet funker ikke med Chrome. Editor registrer ikke enter... Endret 12. november 2010 av RulleRimfrost Lenke til kommentar
quantum Skrevet 12. november 2010 Del Skrevet 12. november 2010 (endret) Finnes noen slags FOR-EACH ROW funksjon i sql? Det ville hvert trist og leit å måtte hente inn kildedataene til asp-løsningen i front for så å behandle de der... Edit : forumet funker ikke med Chrome. Editor registrer ikke enter... Du kan bruke en cursor kanskje? (Enter funker forresten helt greit for meg i chrome) Edit: Eksempelvis http://www.jackdonnell.com/articles/SQL_CURSOR.htm Google etter "cursor tsql" så finner du mer. Endret 12. november 2010 av quantum Lenke til kommentar
RulleRimfrost Skrevet 14. november 2010 Forfatter Del Skrevet 14. november 2010 Cursor ser ut til å være riktig ja. Den foreløpige løsningen ble hverken rask eller heldig, da jeg ikke vil at brukere skal kunne opprette tabeller. Jeg oppretter en temp-tabell med stigende id og looper den: declare @i int = 1; declare @currentId varchar(11); declare @rowCount int; create table #tmpTable(id int identity(1,1) primary key, fakeId, field1, field2, osv...); insert into #tmpTable (fakeId, field1, field2. osv...) select * from sourceTable set @rowCount = (select count(*) from #tmpTable); while @i <> @rowCount BEGIN set @currentId = (select fakeId from #tmpTable where id = @i) if not exists(select * from targetTable where fakeId = @currentId) insert into targetTable (fakeId, field1, field2, osv...) select fakeId, field1, field2, osv... from #tmpTable where id = @i; set @i = @i + 1 END Lenke til kommentar
RulleRimfrost Skrevet 15. november 2010 Forfatter Del Skrevet 15. november 2010 Å huff. Testet cursor nå, og om jeg har gjort dette riktig er det grisetreigt. Følgende brukte 21 sek for en kildetabell på ca 10000 rader, der en while loop brukte under 2 sek : declare clientList cursor fast_forward for select fakeId from sourceTable; declare @currentFakeId varchar(11); open clientList; fetch next from ClientList into @currentFakeId while @@fetch_status = 0 BEGIN if not exists(select * from targetTable where id = @currentFakeId) insert into targetTable(fakeId, field1, field2, osv...) select fakeId, field1, field2, osv... from sourceTable where fakeId = @currentFakeId fetch next from ClientList into @currentFakeId END close clientList; deallocate clientList; Lenke til kommentar
quantum Skrevet 15. november 2010 Del Skrevet 15. november 2010 Å huff. Testet cursor nå, og om jeg har gjort dette riktig er det grisetreigt. Følgende brukte 21 sek for en kildetabell på ca 10000 rader, der en while loop brukte under 2 sek : declare clientList cursor fast_forward for select fakeId from sourceTable; declare @currentFakeId varchar(11); open clientList; fetch next from ClientList into @currentFakeId while @@fetch_status = 0 BEGIN if not exists(select * from targetTable where id = @currentFakeId) insert into targetTable(fakeId, field1, field2, osv...) select fakeId, field1, field2, osv... from sourceTable where fakeId = @currentFakeId fetch next from ClientList into @currentFakeId END close clientList; deallocate clientList; Kan du ikke bare hente ut det du skal ha fra sourceTable direkte i cursoren så slipper du å slå opp i den tabellen en gang til? Ikke sikkert det blir 10 ganger raskere, men det kunne jo være interessant å se... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå