9
votes

Concaténation en ligne avec pour XML, mais avec plusieurs colonnes?

J'utilise souvent des requêtes comme: xxx

Je veux souvent avoir plusieurs champs concaténés concaténés de cette table, au lieu d'une seule. Je pouvais logiquement faire ceci: xxx

mais il a l'air de merde et d'erreur sujette lorsque quelque chose doit être mis à jour; Souvent également une longue liste de tables jointes afin qu'elle puisse également avoir des implications de performance obtenant les mêmes tables de plus et plus.

Y a-t-il un meilleur moyen de le faire?

merci.


0 commentaires

3 Réponses :


3
votes

Vous pouvez créer un Fonction agrégate définie par l'utilisateur CLR qui fait La concaténation pour vous.

Votre code ressemblerait à cela à la place. P>

select S.ID,
       dbo.Concat(S.SomeField1), 
       dbo.Concat(S.SomeField2),
       dbo.Concat(S.SomeField3)
from SomeTable as S
group by S.ID


0 commentaires

12
votes

Vous pouvez faire quelque chose comme ça. Au lieu d'envoyer immédiatement la valeur XML à une chaîne, cette requête utilise le mot-clé de type pour renvoyer un objet de type XML qui peut ensuite être interrogé. Les trois fonctions de requête recherchent l'objet XML pour toutes les instances de l'élément quelquefield et renvoient un nouvel objet XML contenant uniquement ces valeurs. Ensuite, la fonction de valeur élimine les étiquettes XML entourant les valeurs et les transmet dans un varchar (max) xxx


0 commentaires

2
votes

C'est la même réponse que j'ai donné ici: https://dba.stackege.com/ Questions / 125771 / Multiple-colonne-Concaténation /

L'OP de cette question a référé la réponse donnée ici. Vous pouvez voir ci-dessous que la réponse la plus simple peut parfois être la meilleure. Si jamais, c'est de multiples tables, je vais aller de l'avant et placez-le dans un CTE pour éviter d'avoir le même code complexe plusieurs fois multiple. P>

J'ai couru quelques tests en utilisant un peu plus de 6 lignes. Avec un index sur la colonne ID. P>

Voici ce que j'ai proposé. P>

Votre requête initiale: P>

SELECT test.id,
    STUFF((SELECT ', ' + name
            FROM   test ThisTable
            WHERE  test.id = ThisTable.id
            FOR XML PATH ('')),1,2,'') AS ConcatenatedSomeField,
    STUFF((SELECT ', ' + car
            FROM   test ThisTable
            WHERE  test.id = ThisTable.id
            FOR XML PATH ('')),1,2,'') AS ConcatenatedSomeField2
FROM test 
GROUP BY id


0 commentaires