Durchführen String-Verkettung von Datenzeilen in einer SQL-Ansicht (Schwenk?)
-
22-09-2019 - |
Frage
Ich möchte eine Ansicht in SQL Server, dass Mähdreschern Metadaten mehrere Stücke von Datenbank erstellen.
Ein Stück von Metadaten I Leben in der sys.syscomments
Tabelle will - die relevanten Spalten sind wie folgt:
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!
Wie Sie die Daten in der Spalte „Text“ sehen kann, ist aufgeteilt in mehrere Zeilen, wenn es die maximale Länge übergibt (8000 Byte / 4000 Zeichen in SQL Server, 12 Zeichen in meinem Beispiel). colid
identifiziert die Reihenfolge, in der Sie den Text wieder zusammenzubauen.
Ich möchte Abfrage machen / Unterabfrage aus meiner Sicht die Kommentare aus der sys.syscomments Tabelle wieder zusammenzusetzen, so dass ich:
id comment (nvarchar(max))
---- ----------------------------------
1001 A comment.
1002 This is a long comment.
1003 This is an even longer comment!
Irgendwelche Vorschläge oder Lösungen? Geschwindigkeit ist nicht in irgendeiner Weise kritisch, aber Einfachheit und die geringen Auswirkungen (I CLR-Funktionen vermeiden möchte und dergleichen - im Idealfall das Ganze in der Sichtdefinition verpackt werden würde). Ich habe in einige XML-basierten Vorschläge gesucht, aber die Ergebnisse haben Text mit XML Escape-Strings gefüllt produziert.
Lösung
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
Andere Tipps
Es gibt mehrere mögliche Lösungen. Die einfachste ist CTE zu verwenden. Dieser Artikel hat eine gute Diskussion über das Thema: Verketten Row Werte in Transact-SQL
Schauen Sie hier: Concatenate Werte aus mehreren Zeilen in einer Spalte Bestellen
Warum nicht benutzen sys.sql_modules Definition Spalten, die speichert die Daten als eine einzelne nvarchar (max)?
Statt Lesen mehrerer syscomments Text (nvarchar (4000)) Spalten verteilt über mehrere Zeilen und mit zu verketten.
SELECT object_id, definition FROM sys.sql_modules
Nur so ein Gedanke ... Sie sagten einfach: -)