2009-12-02 21 views
7

Dada una tabla "ABC" con columnas Col1, Col2 y Col3 es posible generar automáticamente algo como lo siguiente:Prefijo de todas las columnas de instrucción T-SQL

SELECT 
Col1 AS 'ABC_Col1', 
Col2 AS 'ABC_Col2', 
Col3 AS 'ABC_Col3' 
FROM ABC 

Tengo una tabla sin un conjunto fijo de columnas (los usuarios pueden agregar sus propias columnas) donde todavía necesito el prefijo de columna (porque es necesario en un JOIN/CTE con otras tablas que también tienen columnas con los nombres Col1, Col2, etc.)

Por lo tanto, me gustaría poder escribir algo como esto:

SELECT 
T0.* AS 'ABC_T.*', 
FROM ABC T0 

¿Cuál es, por supuesto, SQL no válido, pero se puede hacer de alguna manera para que todas las columnas "*" obtengan el mismo prefijo?

Respuesta

3

Esto le dará un mapa de nombres de columna viejos y nuevos nombres de columna:

SELECT syscolumns.name as old_column_name, 'ABC_' + syscolumns.name as new_column_name 
    FROM sysobjects 
     JOIN syscolumns ON sysobjects.id = syscolumns.id 
    WHERE sysobjects.name = 'ABC' 
ORDER BY sysobjects.name,syscolumns.colid 

Desde allí es sólo algunas de SQL dinámico. Todavía estoy jugando con eso.

EDITAR

OK, lo que abandonó.

DECLARE @sql varchar(max) 
SET @sql = 'SELECT ' 

DECLARE @old_column_name varchar(50) 
DECLARE @getNext CURSOR 
SET @getNext = CURSOR FOR 
    SELECT syscolumns.name 
     FROM sysobjects 
      JOIN syscolumns ON sysobjects.id = syscolumns.id 
     WHERE sysobjects.name = 'ABC' 
OPEN @getNext 
FETCH NEXT FROM @getNext INTO @old_column_name 
WHILE @@fetch_status = 0 
BEGIN 

    --BUILD DYNAMIC SQL 
    SET @sql = @sql + @old_column_name + ' AS ''ABC_' + @old_column_name + ''', ' 

FETCH NEXT FROM @getNext INTO @old_column_name 
END 
CLOSE @getNext 
DEALLOCATE @getNext 

--REMOVE FINAL COMMA AND ADD TABLE 
SET @sql = SUBSTRING(@sql, 0, LEN(@sql)) + ' FROM ABC' 

exec(@sql) 

A) esto es terrible rendimiento (porque es un cursor)

B) Sé que no está destinado a hacer un trabajo para la gente de aquí, pero me dejé llevar.

C) Consideré que ni siquiera publicaba esto por lo pobre que soy, pero es una idea.

+0

Gracias por el esfuerzo ... Esperaba que hubiera una forma diferente a la sql dinámica (y dado que parece que no existe, no voy a seguir esta ruta) ... – RWJ

2

Parece confundido en cuanto a lo que hacen los alias de columna. Como puede ver en su cláusula select, ya solo está seleccionando campos del T0 haciendo referencia al T0.*. Todavía puede hacer referencia a esos campos como T0.<whatever> más tarde en su consulta sin aliasing los campos, solo tendrá que hacer referencia a ellos por su nombre de campo completo, es decir, T0.[My Users Suck And Make Really Long Field Names].

EDITAR: Para ser más claro, no puede cambiar el prefijo de un campo mediante aliasing. Solo puedes cambiar el nombre de la misma. El prefijo del campo es el alias de la tabla de la que proviene.

+0

¿Cuota de remitente para comentar? Nada de lo que dije aquí es incorrecto. – Donnie

+0

@Donnie: Probable vencimiento táctico de alguien –

+0

Sé que T0. * Puede ser referenciado como A. pero como menciono, esta muestra se usará más adelante en una combinación más avanzada y una Expresión de tabla común (CTE). Y en ese momento habrá un T0, T1, T2, etc. donde algunos de los campos tienen los mismos nombres de columna ... en uniones * todavía funcionará, pero en los CTE no es posible tener los mismos nombres de columna dos veces. . – RWJ

0

Creo que la única forma en que podrá hacerlo es mediante la creación de SQL dinámico.

Cuestiones relacionadas