2011-12-09 21 views
5

Sto tentando di eseguire una query SQL che rinominerà le colonne di una tabella con il testo del primo recordset in una tabella.Rinominare le colonne di una tabella SQL con i valori di campo di una tabella

Il mio tavolo si presenta così:

COL1 | COL2 | COL3 | COL4 | COL5 | COL6 

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 
tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

E vorrei rinominare le colonne in questo modo:

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 

tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

risposta

4

Questa procedura farà ciò di cui hai bisogno. È possibile eseguire come segue:

exec p_rename_columns N'<mytable>' 

noti che la procedura si presume che la riga "prima" è la prima fila fisico su disco. Poiché questo può cambiare a seconda del campo in cui viene utilizzato l'indice cluster sulla tabella, non è garantito al 100%.

Il codice per la procedura:

create proc p_rename_columns (@table sysname) 
AS 

declare @name sysname, 
     @col sysname, 
     @sql nvarchar(max) 

declare cur cursor 
local read_only 
for select name 
     from sys.columns 
    where object_id = object_id(@table) 

open cur 
fetch next from cur into @name 

while @@fetch_status = 0 
    begin 

    select @sql = N'select top (1) @col = ' + quotename(@name) + N' from ' + quotename(@table) 
    exec sp_executesql @sql, N'@col sysname output', @col output 

    select @sql = N'exec sp_rename ''' + quotename(@table) + N'.' + quotename(@name) + N''', ''' + @col + N'''' 
    exec (@sql) 

    fetch next from cur into @name 
    end 
close cur 
deallocate cur 

select @sql = N'DELETE TOP (1) from ' + quotename(@table) 
exec (@sql) 
GO 
+0

Perfetto, grazie mille per questo è esattamente quello che ho richiesto !! – neilrudds

+0

Ho aggiunto alcune chiamate su nome() mancanti. –

2

Non c'è modo semplice in puro SQL, le opzioni principali sono per costruire una query SQL dinamica o semplicemente restituire un singolo set di risultati e lasciare che sia gestito dal livello di presentazione.

Ma la domanda più grande è perché si stanno mescolando dati e metadati nella stessa tabella? Se una riga ha i nomi delle colonne e tutto il resto sono dati, quindi basta creare una tabella con i nomi delle colonne corretti e caricare i dati in essa. Dato che sembra che tu stia caricando un file CSV, potresti fare use SSIS per fare la maggior parte del lavoro per te.

+0

Il problema è che il tavolo deve essere creato in modo dinamico, ci sono diversi file CSV in una cartella e ogni file ha un diverso insieme di intestazioni (identici e non identici). L'obiettivo finale è quello di recuperare i dati da tutti questi file CSV in una cartella e combinarli in un'unica tabella. – neilrudds

+0

SSIS non è sempre disponibile (SQL Server Express ad esempio) –

+0

È difficile dire quale sia la soluzione migliore senza sapere di più sui dati nei file, su cosa stai cercando di ottenere, ecc. Se sai in anticipo quali saranno le intestazioni essere, e se i file di origine hanno sempre la stessa struttura, è possibile creare una tabella in anticipo con tutte le colonne e caricare ogni file in esso per nome o posizione della colonna. Puoi utilizzare SSIS o uno script esterno nella tua lingua preferita.Ma se tutto è dinamico e sconosciuto in anticipo, dovrai scrivere il tuo codice per affrontarlo. – Pondlife

0

Una volta avuto un problema simile. Imparare altri strumenti come SSIS ha un'alta curva di apprendimento e non sarà economico nel tuo caso, perché lo vuoi solo usare una volta qui (una soluzione ad hoc). D'altra parte, provare a scriverlo in puro T-SQL richiede l'accesso a Viste del catalogo (metadati) e il loro mixaggio con i cursori, oppure utilizzando la funzione Cross Apply per ogni tabella, che è anche difficile.

propongo una soluzioni più semplici:

  1. Se si vuole fare solo una volta, e le tabelle non sono più di dire 10 o 20 tavoli, semplicemente crearli a mano in un nuovo database, e quindi scrivi una semplice query di inserimento per popolare nuove tabelle e rimuovi le righe indesiderate.
  2. Se si dispone di più tabelle, si dice più di 20 tabelle o si desidera eseguire questo processo più volte (parte di una soluzione più ampia), fare semplicemente ciò che si desidera fare in .NET. In altre parole, ottieni l'elenco di tutte le tabelle del tuo database nel tuo codice, quindi per ogni tabella, ottieni la prima riga, quindi crea una nuova tabella con i titoli delle colonne corrispondenti, ecc. Il punto principale qui è che hai molto alimentazione nell'ambiente .NET, rispetto a T-SQL.
Problemi correlati