2009-12-02 6 views
7

donné une table « ABC » avec des colonnes Col1, Col2 et Col3 il est possible de générer automatiquement quelque chose comme ce qui suit:Prefix toutes les colonnes instruction T-SQL

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

J'ai une table sans un ensemble fixe de colonnes (les utilisateurs peuvent ajouter leurs propres colonnes) où j'ai toujours besoin du préfixe de colonne (parce qu'il est nécessaire dans un JOIN/CTE avec d'autres tables qui ont aussi des colonnes avec les noms Col1, Col2 etc ...)

Par conséquent, je voudrais être en mesure d'écrire quelque chose comme ceci:

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

Ce qui n'est bien sûr pas valide SQL, mais peut-il être fait d'une manière ou d'une autre afin que les colonnes "*" obtiennent tous le même préfixe?

Répondre

3

Cela vous donnera une carte de vieux noms de colonnes et de nouveaux noms de colonnes:

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 

De là, il est juste un peu sql dynamique. Je joue toujours avec.

EDIT

OK, j'abandonné cela.

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) c'est terrible performance (parce qu'il est un curseur)

B) Je sais que vous n'êtes pas censé faire le travail pour les gens ici, mais je me suis emporté. C) Je ne pensais même pas poster cela à cause de la médiocrité d'une réponse que je sens, mais c'est au moins une idée.

+0

Merci pour l'effort .. J'espérais qu'il y avait une autre façon que dynamique SQL (et comme il semble ne pas y avoir je ne vais pas aller sur cette route) ... – RWJ

2

Vous semblez confus quant aux alias de colonnes. Comme vous pouvez le voir dans votre clause select, vous sélectionnez déjà des champs de T0 en faisant référence à T0.*. Vous pouvez toujours référencer ces champs comme T0.<whatever> plus tard dans votre requête sans aliaser les champs, il vous suffira de vous y référer par leur nom de champ complet, ie T0.[My Users Suck And Make Really Long Field Names].

EDIT: Pour être plus clair, vous ne pouvez pas changer le préfixe d'un champ en l'aliasant. Vous pouvez seulement changer le nom de celui-ci. Le préfixe du champ est l'alias de la table d'où il vient.

+0

Downvoter soin de commenter? Rien que j'ai dit ici est incorrect. – Donnie

+0

@Donnie: Probablement downvoting tactique de quelqu'un –

+0

Je sais que T0. * Peut être référencé comme À. mais comme je le mentionne cet exemple doit être utilisé plus tard dans une jointure plus avancée et une expression de table commune (CTE). Et à ce moment-là il y aura un T0, T1, T2, etc où certains des champs ont les mêmes noms de colonnes .. dans les jointures * fonctionnera encore mais dans CTE il n'est pas possible d'avoir deux fois les mêmes noms de colonnes. – RWJ

0

Je pense que la seule façon de faire cela est de créer du SQL dynamique.

Questions connexes