Я пытаюсь перенести приложение на основе MySQL на Microsoft SQL Server 2005 (не по выбору, но это жизнь).
В исходном приложении мы почти полностью использовали операторы, совместимые с ANSI-SQL, за одним существенным исключением - мы group_concat
довольно часто использовали функции MySQL .
group_concat
Кстати, так: приведена таблица, скажем, имен сотрудников и проектов ...
SELECT empName, projID FROM project_members;
возвращает:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... и вот что вы получите с group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
возвращает:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Итак, что я хотел бы знать: возможно ли написать, скажем, пользовательскую функцию в SQL Server, которая эмулирует функциональность group_concat
?
У меня почти нет опыта использования UDF, хранимых процедур или чего-то в этом роде, просто простой SQL, поэтому, пожалуйста, ошибитесь в стороне от слишком большого количества объяснений :)
Ответы:
Нет НАСТОЯЩЕГО простого способа сделать это. Хотя там много идей.
Лучший, который я нашел :
Или версия, которая работает правильно, если данные могут содержать такие символы, как
<
источник
Возможно, я немного опоздал на вечеринку, но этот метод работает для меня и проще, чем метод COALESCE.
источник
Возможно, слишком поздно, чтобы принести пользу сейчас, но разве это не самый простой способ сделать что-то?
источник
SQL Server 2017 действительно вводит новую функцию агрегирования
STRING_AGG ( expression, separator)
,Связанные элементы можно заказать, добавив
WITHIN GROUP (ORDER BY some_expression)
Для версий 2005-2016 я обычно использую метод XML в принятом ответе.
Это может потерпеть неудачу в некоторых обстоятельствах, однако. например, если данные для объединения содержат,
CHAR(29)
вы видитеБолее надежный метод, который может работать со всеми символами, - использовать агрегат CLR. Однако применение упорядочения к объединенным элементам является более сложным при таком подходе.
Метод присвоения переменной не гарантируется и его следует избегать в производственном коде.
источник
Взгляните на проект GROUP_CONCAT на Github, я думаю, что я делаю именно то, что вы ищете:
источник
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
Чтобы объединить все имена руководителей проектов из проектов, в которых есть несколько менеджеров проектов, напишите:
источник
С помощью приведенного ниже кода вы должны установить PermissionLevel = External в свойствах вашего проекта перед развертыванием и изменить базу данных на доверие к внешнему коду (обязательно прочитайте в другом месте о рисках безопасности и альтернативах [например, сертификатах]), запустив "ALTER DATABASE database_name SET НАДЕЖНО НА ".
Я проверил это с помощью запроса, который выглядит следующим образом:
И дает: A, B, C, D
источник
Пробовал это, но для моих целей в MS SQL Server 2005 было наиболее полезным следующее, которое я нашел на xaprb
@ Отметьте, как вы упомянули, это был космический персонаж, который вызвал проблемы для меня.
источник
Об ответе Хардимана, как насчет:
Кстати, является ли использование «Фамилии» опечаткой или я не понимаю концепцию здесь?
В любом случае, спасибо большое, ребята, потому что это спасло меня довольно много времени :)
источник
Для моих коллег по Google вот очень простое решение «включай и работай», которое сработало для меня после того, как я некоторое время боролся с более сложными решениями:
Обратите внимание, что мне пришлось преобразовать идентификатор в VARCHAR, чтобы объединить его в виде строки. Если вам не нужно этого делать, вот еще более простая версия:
Вся заслуга в этом идет здесь: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- SQL-сервер? форум = transactsql
источник