Próbuję migrować aplikację opartą na MySQL do Microsoft SQL Server 2005 (nie z wyboru, ale takie jest życie).
W oryginalnej aplikacji używaliśmy prawie całkowicie instrukcji zgodnych z ANSI-SQL, z jednym znaczącym wyjątkiem - group_concat
dość często korzystaliśmy z funkcji MySQL .
group_concat
nawiasem mówiąc, robi to: biorąc pod uwagę tabelę, powiedzmy, nazwisk pracowników i projektów ...
SELECT empName, projID FROM project_members;
zwroty:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... a oto, co otrzymujesz dzięki group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
zwroty:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Chciałbym więc wiedzieć: czy w SQL Server można napisać funkcję zdefiniowaną przez użytkownika, która emuluje jej funkcjonalność group_concat
?
Nie mam prawie żadnego doświadczenia w korzystaniu z UDF, procedur przechowywanych itp., Po prostu prosty SQL, więc proszę o pomyłkę po zbyt wielu wyjaśnieniach :)
Odpowiedzi:
Nie ma PRAWDZIWEGO łatwego sposobu na zrobienie tego. Jednak istnieje wiele pomysłów.
Najlepszy, jaki znalazłem :
Lub wersja, która działa poprawnie, jeśli dane mogą zawierać znaki takie jak
<
źródło
Być może jestem trochę spóźniony na imprezę, ale ta metoda działa dla mnie i jest łatwiejsza niż metoda COALESCE.
źródło
Być może jest już za późno, aby przynieść korzyści, ale czy nie jest to najłatwiejszy sposób na zrobienie czegoś?
źródło
SQL Server 2017 wprowadza nową funkcję agregującą
STRING_AGG ( expression, separator)
.Połączone elementy można zamówić, dołączając
WITHIN GROUP (ORDER BY some_expression)
W przypadku wersji 2005-2016 zwykle używam metody XML w zaakceptowanej odpowiedzi.
Jednak w niektórych okolicznościach może się to nie powieść. na przykład, jeśli dane mają być łączone zawiera
CHAR(29)
widaćBardziej niezawodną metodą, która może poradzić sobie ze wszystkimi postaciami, byłoby użycie agregatu CLR. Jednak zastosowanie tego uporządkowania w połączonych elementach jest trudniejsze.
Metoda przypisywania do zmiennej nie jest gwarantowana i należy jej unikać w kodzie produkcyjnym.
źródło
Spójrz na projekt GROUP_CONCAT na Github, myślę, że robię dokładnie to, czego szukasz:
źródło
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
Aby połączyć wszystkie nazwiska kierowników projektów z projektów, które mają wielu kierowników projektów, napisz:
źródło
Za pomocą poniższego kodu musisz ustawić PermissionLevel = Zewnętrzne we właściwościach projektu przed wdrożeniem i zmienić bazę danych, aby ufała kodowi zewnętrznemu (koniecznie przeczytaj gdzie indziej o zagrożeniach bezpieczeństwa i alternatywach [jak certyfikaty]), uruchamiając polecenie „ZMIEŃ bazę danych TRUSTWORTHY ON ”.
Przetestowałem to za pomocą zapytania, które wygląda następująco:
I daje: A, B, C, D
źródło
Próbowałem tych, ale dla moich celów w MS SQL Server 2005 najbardziej przydatne były następujące, które znalazłem na xaprb
@Zaznacz, jak wspomniałeś, to znak kosmiczny sprawił mi problemy.
źródło
O odpowiedzi J Hardimana, a co powiesz na:
Nawiasem mówiąc, czy użycie „nazwiska” jest literówką, czy też nie rozumiem tutaj pojęcia?
W każdym razie, wielkie dzięki, chłopaki, ponieważ zaoszczędziło mi to sporo czasu :)
źródło
Dla moich kolegów Googlersów, oto bardzo proste rozwiązanie typu plug-and-play, które działało dla mnie po zmaganiu się z bardziej złożonymi rozwiązaniami przez jakiś czas:
Zauważ, że musiałem przekonwertować identyfikator na VARCHAR, aby połączyć go jako ciąg. Jeśli nie musisz tego robić, oto jeszcze prostsza wersja:
Wszelkie podziękowania należą się tutaj: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- sql-server? forum = transactsql
źródło