2009-12-02 10 views
7

dato un tavolo "ABC" con colonne Col1, Col2 e Col3 è possibile generare automaticamente qualcosa di simile al seguente:prefisso tutte le colonne di istruzione T-SQL

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

Ho una tabella senza un insieme fisso di colonne (gli utenti possono aggiungere le proprie colonne) dove ho ancora bisogno del prefisso di colonna (perché è necessario in un JOIN/CTE con altre tabelle che hanno anche colonne con i nomi Col1, Col2 ecc ...)

Quindi vorrei scrivere qualcosa del genere:

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

Quale ovviamente non è SQL valido, ma può essere fatto in qualche modo così le colonne "*" ottengono tutte lo stesso prefisso?

risposta

3

Questo vi darà una mappa di nomi di colonna vecchi e nuovi nomi di colonna:

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 

Da lì è solo un po 'di SQL dinamico. Ci sto ancora giocando.

EDIT

OK, ho abbandonato questo.

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) questo è terribile prestazioni (perché è un cursore)

B) Lo so che non sei destinato a fare il lavoro per le persone qui, ma mi sono lasciato trasportare.

C) Ho pensato di non pubblicare nemmeno questo a causa di quanto sia scarsa la risposta che sento, ma è meno che un'idea.

+0

Grazie per lo sforzo .. Speravo che ci fosse un altro modo rispetto a SQL dinamico (e dal momento che sembra non esserci non ho intenzione di andare su questa rotta) ... – RWJ

2

Sembra confuso su cosa facciano gli alias di colonna. Come puoi vedere nella tua clausola select, stai già selezionando i campi da T0 facendo riferimento allo T0.*. È ancora possibile fare riferimento a tali campi come T0.<whatever> in seguito nella query senza aliasing dei campi, sarà sufficiente fare riferimento a essi tramite il nome completo del campo, ad esempio T0.[My Users Suck And Make Really Long Field Names].

MODIFICA: per maggiore chiarezza, non è possibile modificare il prefisso di un campo aliasandolo. Puoi solo cambiarne il nome. Il prefisso del campo è l'alias della tabella da cui proviene.

+0

Assistenza per il downfer di commentare? Niente di ciò che ho detto qui non è corretto. – Donnie

+0

@Donnie: Probabilmente il downvoting tattico di qualcuno –

+0

So che T0. * Può essere referenziato come a. ma, come ho già detto, questo esempio verrà utilizzato in un join più avanzato e in una Common Table Expression (CTE). E in quel momento ci sarà un T0, T1, T2, ecc dove alcuni dei campi hanno lo stesso nome di colonna .. in join * funzionerà ancora ma in CTE non è possibile avere lo stesso nome di colonna due volte .. – RWJ

0

Penso che l'unico modo per farlo sia creare un SQL dinamico.

Problemi correlati