Avatar billede lanthernen Nybegynder
10. april 2008 - 18:07 Der er 8 kommentarer og
1 løsning

Unikt id i kolonner

Hejsa

Har en DB hvor der er en tabel med ca. 100000 records.

Jeg har 1 kolonne i denne tabel hvor hver record skal være unik.

Lige nu er kolonnen = 0

Hver record skal tælle en op, således at:
record1= 251091108800000001
record2= 251091108800000002
record3= 251091108800000003
Avatar billede HenrikSjang Nybegynder
10. april 2008 - 18:10 #1
Findes der en unik id kolonne i tabellen? Kører du på SQL Server 2000 eller 2005?
Avatar billede lanthernen Nybegynder
10. april 2008 - 18:16 #2
Der er unik kolonne PassNO

Der er 2000
Avatar billede HenrikSjang Nybegynder
10. april 2008 - 18:19 #3
Kay. Hvis det havde været 2005, ville jeg lige vupti kunne have smidt dig en stump sql der kunne gøre det, men med 2000 skal jeg lige tænke mig om. Har godt set problemstillingen løst før, og så i noget kode der kan køre på 2000... Jeg skal lige tænke.
Avatar billede lanthernen Nybegynder
10. april 2008 - 18:19 #4
OK
Avatar billede HenrikSjang Nybegynder
10. april 2008 - 19:29 #5
Denne skulle vist fungere. Jeg har antaget, at din kolonne med records er en VARCHAR(100)... Hvis den derimod er en BIGINT, så skal du lige fjerne en CAST fra dette.

Løsningen er ikke særlig elegant, da den blot laver en cursor, og looper igennem alle 100.000 rækker, og opdaterer dem én ad gangen. Hvis det er en one-timer, så er det fint nok - men hvis det skal gøres tit og ofte, så skal man nok lige finde noget lidt pænere.
Men here goes:

----------------------------------------
/*
I nedenstående skal "tableName" rettes til hvad din tabel nu hedder
*/

DECLARE @PassNO INT
DECLARE @counter BIGINT
SET @counter = 251091108800000001

DECLARE myCursor CURSOR FOR 
SELECT PassNO
FROM tableName
ORDER BY PassNO
 
OPEN myCursor
 
FETCH NEXT FROM myCursor
INTO @PassNO 
 
WHILE (@@FETCH_STATUS = 0) BEGIN 
  UPDATE tableName
  SET record = CAST(@counter AS VARCHAR(100)) --fjern evt CAST'en
  WHERE PassNO = @PassNO

  SET @counter = @counter + 1

  FETCH NEXT FROM myCursor
  INTO @PassNO
END 
 
CLOSE myCursor
DEALLOCATE myCursor
----------------------------------------
Avatar billede lorentsnv Nybegynder
11. april 2008 - 14:30 #6
Hvis du vil have din IDENTITY værdi til at starte med en bestemt værdi, kan du bruge IDENTITY SEED. Jeg lavet en testtabel og testet:

CREATE TABLE [dbo].[Table_1](
    [Test] [bigint] IDENTITY(251091108800000001,1) NOT NULL,
    [TestT] [nchar](10) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]

Testtabellen giver første record værdien 251091108800000001, og næste record får automatisk værdien 251091108800000002.
Avatar billede HenrikSjang Nybegynder
18. april 2008 - 19:08 #7
Hvordan går det med denne - har du fundet ud af det?
Avatar billede lanthernen Nybegynder
17. juli 2008 - 11:36 #8
Hejsa - må indrømme vi har løst opgaven uden om disse svar, men jeg vil gerne give jer point for tiden i har brugt...

smid et svar hver
Avatar billede HenrikSjang Nybegynder
17. juli 2008 - 17:54 #9
Så smider jeg da lige et svar.
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