6 votes

Effectuer une concaténation de chaînes de caractères à partir de lignes de données dans une vue TSQL (pivot ?)

J'aimerais créer une vue dans SQL Server qui combine plusieurs éléments de métadonnées de la base de données.

L'une des métadonnées dont j'ai besoin se trouve dans le fichier sys.syscomments les colonnes pertinentes sont les suivantes :

id   colid  text
---- ------ -------------
1001 1       A comment.
1002 1       This is a lo
1002 2       ng comment.
1003 1       This is an e
1003 2       ven longer c
1003 3       omment!

Comme vous pouvez le constater, les données de la colonne "texte" sont divisées en plusieurs lignes si elles dépassent la longueur maximale (8000 octets/4000 caractères dans SQL Server, 12 caractères dans mon exemple). colid identifie l'ordre dans lequel le texte doit être reconstitué.

Je voudrais faire une requête/sous-requête dans ma vue pour réassembler les commentaires de la table sys.syscomments, de sorte que j'ai.. :

id   comment (nvarchar(max))
---- ----------------------------------
1001 A comment.
1002 This is a long comment.
1003 This is an even longer comment!

Des suggestions ou des solutions ? La vitesse n'est en aucun cas critique, mais la simplicité et le faible impact le sont (j'aimerais éviter les fonctions CLR et autres - idéalement, l'ensemble serait enveloppé dans la définition de la vue). J'ai examiné certaines suggestions basées sur XML, mais les résultats ont produit un texte rempli de chaînes d'échappement XML.

13voto

Quassnoi Points 191041
SELECT  id,
        (
        SELECT  text AS [text()]
        FROM    mytable mi
        WHERE   mi.id = md.id
        ORDER BY
                mi.col
        FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)')
FROM    (
        SELECT  DISTINCT id
        FROM    mytable
        ) md

1voto

Giorgi Points 15760

Plusieurs solutions sont possibles. La plus simple consiste à utiliser le CTE. Cet article présente une bonne discussion sur le sujet : Concaténation des valeurs des lignes dans Transact-SQL

1voto

SQLMenace Points 68670

1voto

gbn Points 197263

Pourquoi ne pas utiliser sys.sql_modules les colonnes de définition qui stockent les données sous la forme d'un seul nvarchar(max) ?

Au lieu de lire plusieurs colonnes syscomments text (nvarchar(4000)) réparties sur plusieurs lignes et de devoir les concaténer.

SELECT object_id, definition FROM sys.sql_modules

Juste une idée... vous avez dit simple :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X