2009-05-18 6 views
0

Comment puis-je écrire une procédure stockée dans SQL Server 2005 afin que je puisse afficher les noms de colonne répétés en ajoutant un préfixe? Exemple: Si j'ai 'Others' comme nom de colonne appartenant à plusieurs catégories mappées à une autre table ayant des colonnes comme 'MyColumn', 'YourColumn'. J'ai besoin de joindre ces deux tables pour que mes résultats soient 'M_Others' et 'Y_Athers'. Je peux utiliser un cas mais je ne suis pas sûr d'autres colonnes répétées dans le tableau. Comment écrire dynamiquement pour connaître les répétitions?Obtention de noms de colonnes répétitifs en ajoutant un préfixe au nom de colonne répété dans SQL Server 2005

Merci à l'avance

Répondre

1

Vous devez utiliser des alias dans la projection de la requête: (exemple bogus, montrant l'utilisation)

SELECT c.CustomerID AS Customers_CustomerID, o.CustomerID AS Orders_CustomerID 
FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID 
+0

merci pour le rly mais la chose ici est que je ne suis pas sûr des colonnes répititives qui sont là dans la base de données.s'il existe une répétition de colum nae alors je dois avoir un préfixe qui devrait être pris de la colonne qui à partir de la colonne de la table de jointure –

+0

Je suppose que votre requête est écrite comme: SELECT * FROM ... ? Dans ce cas, veuillez reconsidérer complètement la requête. Cela résoudra automatiquement votre problème, car vous pouvez écrire les noms des colonnes. Vous écrivez une procédure stockée afin que la procédure stockée soit réparée, ce qui signifie qu'elle ne changera pas. Donc, écrivez les noms des colonnes. Bien sûr, si quelqu'un change les tables utilisées, votre proc échouera, mais c'est inévitable à moins que la personne qui change la table communique avec la personne qui écrit le procs. –

1

Vous ne pouvez pas modifier dynamiquement les noms de colonnes sans utiliser SQL dynamique .

Vous devez les alias explicitement. Il n'y a pas moyen de changer "A_Others" ou "B_Others" dans cette requête:

SELECT 
    A.Others AS A_Others, 
    B.Others AS B_Others 
FROM 
    TableA A 
    JOIN 
    TableB B ON A.KeyCol = B.KeyCol 
+0

sélectionnez M.ID_PK, (cas où N.NAME = 'autres', puis sous-chaîne (M.NAME, 1,1) + '_' + N.NAME ELSE N.NAME end) à partir de TEST_TABLE1 M avec (NOLOCK left join TEST_TABLE2 N sur M.ID_PK = N.ID_FK Il s'agit de la requête où nous recherchons le nom de colonne répété, mais ici il est codé en dur.S'il existe une autre colonne répétée dont nous ne sommes pas conscients, alors une erreur se produira si nous utilisons cette requête dans le fichier stocké procure.so est-il possible de trouver les répétitions qui sont dynamiquement données à l'arrière et doivent être traitées dans une procédure stockée qui est une procédure statique, –

+0

Vous voulez trouver toutes les colonnes dans la base de données avec le même nom? Ou assurez-vous que la sortie proc stockée donne des noms uniques? – gbn

+0

Je veux que tous les noms de colonnes et la procédure stockée doivent ajouter un préfixe aux colonnes répétées et afficher les autres colonnes avec eux sans aucun préfixe ajouté. Seules les colonnes répétées doivent être ajoutées avec le préfixe SELECT M. ID_PK, (cas où N.NAME - se produit plusieurs fois - ALORS sous-chaîne (M.NAME, 1,1) + '_' + N.NAME ELSE N.NAME fin) FROM TEST_TABLE1 M WITH (NOLOCK GAUCHE JOIN TEST_TABLE2 N ON M.ID_PK = N.ID_FK dans cette requête j'ai besoin d'une condition pour obtenir les colonnes répétées –

0

select n.id_pk, (cas où groupcount.n_count> 1, puis sous-chaîne (m.name, 1, 1) + '_' + n.name autre extrémité n.name) de test_table1 m
gauche rejoindre test_table2 n sur m.id_pk = n.id_fk
jointure gauche (sélectionnez le nom, count (nom) comme n_count du groupe test_table2 par nom) compte de groupe sur n.nom = numéro de groupe.nombre

1

Si le les colonnes contiennent les mêmes données (c.-à-d. ce sont les champs de jointure), vous ne devriez quand même pas envoyer les deux dans la requête car c'est une mauvaise pratique et cela gaspille à la fois les ressources serveur et réseau. Vous ne devez pas utiliser select * dans les requêtes sur la production, surtout s'il y a des jointures. Si vous écrivez correctement du code SQL, vous aliasz au fur et à mesure quand il y a deux colonnes avec le même nom qui signifient des choses différentes (par exemple si vous avez rejoint deux fois la table des personnes, une fois pour obtenir le nom du docteur le nom du patient). Le faire de manière dynamique à partir des tables système serait non seulement inefficace mais pourrait finir par vous donner un gros trou de sécurité en fonction de la façon dont vous avez écrit le code. Vous voulez économiser cinq minutes ou moins en développement en affectant de façon permanente les performances pour chaque utilisateur et en nuisant éventuellement à la sécurité des données. C'est ce que les gens de la base de données appellent une mauvaise chose.

Questions connexes