24. september 2010 - 11:43Der 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...?
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?
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
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.
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.
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.