Eseguire stringa concatenazione di righe di dati in una vista SQL (perno?)
-
22-09-2019 - |
Domanda
Mi piacerebbe creare una vista in SQL Server, che combina diversi pezzi di metadati del database.
Un pezzo di metadati voglio vive nella tabella sys.syscomments
- le colonne pertinenti ripresi sono i seguenti:
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!
Come si può vedere i dati nella colonna "testo" è suddiviso in più righe se passa la lunghezza massima (8000 byte / 4000 caratteri in SQL Server, 12 caratteri nel mio esempio). colid
identifica l'ordine in cui assemblare il testo nuovo insieme.
Vorrei fare domanda / subquery a mio avviso, per rimontare i commenti dalla tabella sys.syscomments, in modo da avere:
id comment (nvarchar(max))
---- ----------------------------------
1001 A comment.
1002 This is a long comment.
1003 This is an even longer comment!
Qualche suggerimento o soluzioni? La velocità non è in alcun modo critico, ma la semplicità e basso impatto è (vorrei evitare di funzioni CLR e simili - idealmente il tutto sarebbe avvolto nella definizione della vista). Ho esaminato alcuni suggerimenti basati su XML, ma i risultati hanno prodotto il testo pieno di stringhe di fuga XML.
Soluzione
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
Altri suggerimenti
Ci sono diverse soluzioni possibili. Il più semplice è quello di utilizzare CTE. Questo articolo ha buona discussione sul tema: concatenazione dei valori di riga in Transact-SQL
Date un'occhiata qui: Concatena valori Dalle più righe in una sola colonna Ordinati
Perché non usare sys.sql_modules colonne di definizione che memorizza i dati come un singolo nvarchar (max)?
Invece di leggere diversi syscomments testo (nvarchar (4000)) colonne distribuite su più righe e avere per concatenare.
SELECT object_id, definition FROM sys.sql_modules
Solo un pensiero ... hai detto semplice: -)