Problemet er, at du har et blob felt (sandsynligvis TEXT) - blob felter kan ikke behandles som "normale" datatyper fordi de kan indeholde 2 GB data.
Hvis du er vant til Access kan det være årsagen til at du har brugt TEXT felter uden egentlig at have behov for det. Dvs hvis du kan leve med mindre datamængder bør du ændre datatypen TEXT til VARCHAR. Når man benytter VARCHAR kan en række dog maks indeholde 8000 bytes.
Men antal rækker er uden betydning - via EM (Enterprise Manager) kan du ændre datatyperne uden at du behøver at gøre noget videre. Problemet er, hvis du har så meget tekst i et TEXT felt at det ikke kan være i en VARCHAR.
du kan checke længden af data i hver kolonne ved at fyre en sådan sql af
select * from min tabel where len(felt)+len(felt)+len(felt)+len(felt) > 7500
det fortæller dig hvilke rækker der kan give problemer (du skal kun gøre det på de felter der indeholder tekstværdier (TEXT, VARCHAR etc).
Men du kan også lige prøve nedenstående
select count(*), felt, felt, felt, felt from mintabel group by felt, felt, felt, felt having count(*)>1
muligvis får du nu en oversigt over de dublerede rækker - eller en fejl igen på dit TEXT felt..
Skal lige høre - har du en identity kolonne eller andet der giver dig unik identificering af rækker - eller har du dubletter i alle kolonner i tabellen?
Jeg tror ikke der er unik identificering af rækker, som du skriver. Jeg har prøvet at ændre de 2 text kolonner jeg havde til VARCHAR, og så kan jeg køre :
select distinct * into #tempdata from mintabel truncate table mintabel insert into mintabel select * from #tempdata
Men det ændre ikke noget :o( det er vel osse klart hvis der er sammenfald i flere rækker. Er der kun den manuelle metode tilbage ?
Select distinct fjerner dubletter så der kun er en enkelt af de dublerede rækker tilbage. Så hvis ovenstående har kørt kan der ikke være dubeltter tilbage.
Men dublet i ovenstående er en række hvor samtlige felter er dublerede - hvis der er forskel blot i et enkelt felt - f.eks. i milisekunder i et datofelt - så er rækken ikke en dublet!
Mit problem er (tror jeg), at der ikke har været defineret en primary key på min tabel.
Hvis jeg laver en : select distinct * from mintabel = (29385 row(s) affected) Hvis jeg laver en : select distinct NAME from mintabel = (19684 row(s) affected)
Okay, jeg er lidt træt, så du får en ikke elegant løsning - men den burde virke
-- opret først tabel magen til "mintabel" select * into #temp from mintabel where 1=2
-- opret en variabel for hver kolonne i "mintabel" -- datatyper og navne skal matche kolonnerne declare @name varchar(50), @col1 int, @col2 int ....
-- opret en cursor der løber gennem "mintabel" declare crsr cursor local fast_forward for select * from mintabel open crsr -- hent fra cursor ind i variaberne - husk rækkefølgen skal matche kolonnerne fetch next from crsr into @name, @col1, @col2,,,, -- loop while @@fetch_status=00 begin -- check for dublet og indsæt hvis unik if not exists(select 1 from #temp where name=@name) begin insert into #temp values(@name,@anything) end -- som ovenfor - fetch next from crsr into @name, @col1, @col2,,,, end -- luk cursor close crsr deallocate crsr -- hvis output select * from #temp
-- fjern udkommenteringen hvis alt fungerer -- truncate mintabel -- insert into mintabel select * from #temp
Og så vil jeg da foreslå at du lægger en unik constraint på kolonnen "name" - så sker det ikke igen :-)
Synes godt om
Ny brugerNybegynder
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.