Avatar billede ae03 Novice
24. september 2010 - 11:43 Der er 5 kommentarer og
1 løsning

Omdøbe kolonner

Jeg har fire tabeller med spørgeskemadata, hvor kolonnerne i alle fire tabeller er navngivet v1, v2, v3..., uden at disse nødvendigvis indeholder data for samme spørgsmål. Nogle kolonner med samme navn indeholder tilmed forskellige dataformater. Jeg har brug for at samle de fire tabeller til en tabel uden at fx v1 fra de fire tabeller bliver samlet i samme kolonne.
Er der en let måde, som jeg kan bruge til at omdøbe alle kolonner i en tabel, fx til t1v1, t1v2, t1v3...?
Avatar billede HenrikSjang Nybegynder
24. september 2010 - 11:50 #1
Givet en tabel der hedder MyTable som har en kolonne der hedder v1, så kan du omdøbe kolonnen v1 til t1v1 sådan her:

EXEC sp_RENAME 'MyTable.v1', 't1v1', 'COLUMN'

Det skal du så bare lave pr. kolonne, og så er du kørende.
Avatar billede ae03 Novice
27. september 2010 - 09:57 #2
Det var det jeg frygtede, og som jeg gerne ville undgå. Da nogle kolonner hedder fx v12_a, v12_b... kan jeg ikke bare sætte en løkke i gang, som tæller op og omdøber en ad gangen.

Hvis ikke det kan gøres automatisk for hele tabellen, bliver det ret så uoverskueligt at omdøbe ca. 900 kolonner. Er der nogle, der har et godt bud på en automatisk omdøbningsprocedure, som omfatter alle kolonner? Eller endnu bedre et interval af kolonner, som fx v2-v12?
Avatar billede HenrikSjang Nybegynder
27. september 2010 - 19:01 #3
900 kolonner på 4 tabeller? wow, det lyder som et pææænt nasty db-design.

Ohh well, du vil kunne autogenerere alle rename kommandoer sådan her, hvor du bare lige selv skal angive navnene på de 4 tabeller øverst hvor jeg har angivet MyTable1-4. Den vil print'e alle kommandoer, som du så bagefter kan kopiere over i et nyt queryvindue og eksekvere manuelt:

DECLARE columns CURSOR
READ_ONLY
FOR
    select
        quotename(t2.name) + '.' + quotename(t1.name) as TableName,
        quotename(t3.name) as ColumnName,
        t1.name+'_'+t3.name as NewColumnName
    from
        sys.tables t1
        inner join sys.schemas t2 on t1.schema_id = t2.schema_id
        inner join sys.columns t3 on t1.object_id = t3.object_id
    WHERE t1.name IN (
        'MyTable1',
        'MyTable2',
        'MyTable3',
        'MyTable4'
    )
DECLARE @TableName sysname, @ColumnName sysname, @NewColumnName sysname

OPEN columns

FETCH NEXT FROM columns INTO @TableName, @ColumnName, @NewColumnName
WHILE (@@fetch_status= 0)
BEGIN
    PRINT 'EXEC sp_RENAME ''' + @TableName+'.' + @ColumnName + ''', ''' + @NewColumnName + ''', ''COLUMN'''
   
    FETCH NEXT FROM columns INTO @TableName, @ColumnName, @NewColumnName
END

CLOSE columns
DEALLOCATE columns
GO
Avatar billede HenrikSjang Nybegynder
27. september 2010 - 19:02 #4
Det skal lige siges, at ovenstående prefikser de nye kolonnenavne med tabelnavnet + '_'. Dvs hvis tabellen MyTable har en kolonne der hedder v1, så vil kolonnen komme til at hedde MyTable_v1.
Avatar billede ae03 Novice
28. september 2010 - 08:41 #5
Designet er nu ikke så nasty. Der er tale om svar på 4 forskellige spørgeskemaer med 200-250 variable (20-24 ret kompakte sider) i hver, som er lagt ind i hver sin tabel. Det ville være temmeligt tungt at arbejde med, hvis de skulle deles op i mindre tabeller.
Jeg kan ikke se andet, end at ovenstående skulle virke fint, men jeg skal lige lege lidt med det, når jeg får tid, så jeg ikke ender med at lave ulykker i min db. Det skal du ikke vente på, så hvis du leverer et svar, er pointende dine.

Tak for hjælpen!
Lars
Avatar billede HenrikSjang Nybegynder
01. oktober 2010 - 17:36 #6
.)
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