Ich versuche, eine MySQL-basierte App auf Microsoft SQL Server 2005 zu migrieren (nicht nach Wahl, aber so ist das Leben).
In der ursprünglichen App haben wir fast ausschließlich ANSI-SQL-kompatible Anweisungen verwendet, mit einer wesentlichen Ausnahme: Wir haben die MySQL- group_concat
Funktion ziemlich häufig verwendet.
group_concat
tut dies übrigens: eine Tabelle mit beispielsweise Mitarbeiternamen und Projekten ...
SELECT empName, projID FROM project_members;
kehrt zurück:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... und Folgendes erhalten Sie mit group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
kehrt zurück:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Ich möchte also Folgendes wissen: Ist es möglich, beispielsweise eine benutzerdefinierte Funktion in SQL Server zu schreiben, die die Funktionalität von emuliert group_concat
?
Ich habe fast keine Erfahrung mit UDFs, gespeicherten Prozeduren oder Ähnlichem, nur mit direktem SQL. Bitte irren Sie sich auf der Seite zu vieler Erklärungen :)
Antworten:
Kein wirklich einfacher Weg, dies zu tun. Es gibt jedoch viele Ideen.
Das Beste, das ich gefunden habe :
Oder eine Version, die korrekt funktioniert, wenn die Daten Zeichen wie enthalten können
<
quelle
Ich bin vielleicht etwas zu spät zur Party, aber diese Methode funktioniert für mich und ist einfacher als die COALESCE-Methode.
quelle
Möglicherweise zu spät, um jetzt von Nutzen zu sein, aber ist dies nicht der einfachste Weg, Dinge zu tun?
quelle
SQL Server 2017 führt eine neue Aggregatfunktion ein
STRING_AGG ( expression, separator)
.Die verketteten Elemente können durch Anhängen sortiert werden
WITHIN GROUP (ORDER BY some_expression)
Für die Versionen 2005-2016 verwende ich normalerweise die XML-Methode in der akzeptierten Antwort.
Dies kann jedoch unter bestimmten Umständen fehlschlagen. zB wenn die zu verkettenden Daten enthalten
CHAR(29)
, sehen SieEine robustere Methode, die mit allen Zeichen umgehen kann, wäre die Verwendung eines CLR-Aggregats. Bei diesem Ansatz ist es jedoch schwieriger, eine Reihenfolge auf die verketteten Elemente anzuwenden.
Die Zuordnung zu einer Variablen ist nicht garantiert und sollte im Produktionscode vermieden werden.
quelle
Schauen Sie sich das GROUP_CONCAT- Projekt auf Github an. Ich glaube, ich mache genau das, wonach Sie suchen:
quelle
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
So verketten Sie alle Projektmanagernamen aus Projekten mit mehreren Projektmanagern:
quelle
Mit dem folgenden Code müssen Sie PermissionLevel = External für Ihre Projekteigenschaften vor der Bereitstellung festlegen und die Datenbank so ändern, dass sie externem Code vertraut (lesen Sie an anderer Stelle Informationen zu Sicherheitsrisiken und Alternativen [wie Zertifikaten]), indem Sie "ALTER DATABASE database_name SET" ausführen VERTRAUENSWERT ".
Ich habe dies mit einer Abfrage getestet, die wie folgt aussieht:
Und ergibt: A, B, C, D.
quelle
Versuchte diese, aber für meine Zwecke in MS SQL Server 2005 war das Folgende am nützlichsten, das ich bei xaprb gefunden habe
@Mark wie du erwähnt hast, war es der Space-Charakter, der mir Probleme bereitete.
quelle
Über J Hardimans Antwort, wie wäre es mit:
Ist die Verwendung von "Nachname" übrigens ein Tippfehler oder verstehe ich hier kein Konzept?
Wie auch immer, vielen Dank, denn es hat mir ziemlich viel Zeit gespart :)
quelle
Für meine Googlerkollegen gibt es hier eine sehr einfache Plug-and-Play-Lösung, die für mich funktioniert hat, nachdem ich eine Weile mit den komplexeren Lösungen zu kämpfen hatte:
Beachten Sie, dass ich die ID in eine VARCHAR konvertieren musste, um sie als Zeichenfolge zu verketten. Wenn Sie das nicht tun müssen, ist hier eine noch einfachere Version:
Alle Gutschriften hierfür finden Sie hier: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- sql-server? forum = transactsql
quelle