2011-12-09 38 views
5

Im tratando de ejecutar una consulta SQL que cambiará el nombre de las columnas de una tabla con el texto del primer conjunto de registros en una tabla.Renombrar las columnas de una tabla SQL con los valores de campo de una tabla

Mi mesa se ve así:

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 

y me gustaría cambiar el nombre de las columnas de la siguiente manera:

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 

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

Respuesta

4

Este procedimiento hará lo que necesite. Se puede ejecutar la siguiente manera:

exec p_rename_columns N'<mytable>' 

Tenga en cuenta que el procedimiento se supone que la "primera" fila es la primera fila física en el disco. Dado que esto puede cambiar según el campo que utilice el índice agrupado de la tabla, no está 100% garantizado.

El código para el procedimiento:

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

Perfecto, muchas gracias por esto es exactamente lo que necesitaba !! – neilrudds

+0

Agregué algunas llamadas faltantes de nombre de pila(). –

2

No hay manera sencilla en SQL puro, las principales opciones son para construir una consulta SQL dinámica o simplemente devuelve un único conjunto de resultados y deja que la capa de presentación lo maneje.

Pero, la gran pregunta es ¿por qué estás mezclando datos y metadatos en la misma tabla? Si una fila tiene los nombres de las columnas y todo lo demás son datos, simplemente cree una tabla con los nombres correctos de las columnas y cargue los datos en ella. Como parece que está cargando un archivo CSV, puede use SSIS para hacer la mayor parte del trabajo por usted.

+0

El problema es que la mesa tiene que ser creado dinámicamente, hay varios archivos CSV en una carpeta y cada archivo tiene un conjunto diferente de cabeceras (idénticos y no idénticos) El objetivo final es recuperar los datos de todos estos archivos csv en una carpeta y combinarlos en una sola tabla. – neilrudds

+0

SSIS no siempre está disponible (SQL Server express, por ejemplo) –

+0

Es difícil decir cuál es la mejor solución sin saber más acerca de los datos en los archivos, lo que está tratando de lograr, etc. Si sabe de antemano, cuáles serán los encabezados ser, y si los archivos fuente siempre tienen la misma estructura, entonces puede crear una tabla por adelantado con todas las columnas y cargar cada archivo por nombre de columna o posición. Puede usar SSIS o un script externo en su idioma preferido.Pero si todo es dinámico y desconocido de antemano, tendrá que escribir su propio código para manejarlo. – Pondlife

0

Una vez que tuvimos un problema similar. Aprender otras herramientas como SSIS tiene una gran curva de aprendizaje y no será económico en su caso, porque solo desea usarlo una vez aquí (una solución ad-hoc). Por otro lado, tratar de escribirlo en T-SQL puro necesita acceder a vistas de catálogo (metadatos) y mezclarlos con cursores, o usar la función de aplicar cruz para cada tabla, lo cual también es difícil.

propongo una solución más simple:

  1. Si sólo desea hacerlo una vez, y sus tablas no son más que decir 10 o 20 mesas, basta con crear a mano en una nueva base de datos, y luego escriba una consulta de inserción simple para rellenar nuevas tablas y elimine las filas no deseadas.
  2. Si tiene muchas tablas, digamos más de 20 tablas, o si desea hacer este proceso muchas veces (parte de una solución más grande), simplemente haga lo que quiera hacer en .NET. En otras palabras, obtenga la lista de todas las tablas de su base de datos en su código, luego, para cada tabla, obtenga la primera fila, luego cree una nueva tabla con los títulos de las columnas correspondientes, etc. El punto principal aquí es que usted tiene mucho poder en el entorno de .NET, que en T-SQL.
Cuestiones relacionadas