Estou tentando migrar um aplicativo baseado no MySQL para o Microsoft SQL Server 2005 (não por opção, mas é a vida).
No aplicativo original, usamos quase inteiramente instruções compatíveis com ANSI-SQL, com uma exceção significativa - usamos a group_concat
função do MySQL com bastante frequência.
group_concat
, a propósito, faz isso: dada uma tabela de, digamos, nomes e projetos de funcionários ...
SELECT empName, projID FROM project_members;
retorna:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... e aqui está o que você obtém com group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
retorna:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Então, o que eu gostaria de saber é: É possível escrever, digamos, uma função definida pelo usuário no SQL Server que emule a funcionalidade do group_concat
?
Não tenho quase nenhuma experiência usando UDFs, procedimentos armazenados ou qualquer coisa assim, apenas SQL direto, por isso, erre no lado de muita explicação :)
Respostas:
Nenhuma maneira fácil e REAL de fazer isso. Muitas idéias lá fora, no entanto.
Melhor que eu encontrei :
Ou uma versão que funcione corretamente se os dados puderem conter caracteres como
<
fonte
Talvez eu esteja um pouco atrasado para a festa, mas esse método funciona para mim e é mais fácil que o método COALESCE.
fonte
Possivelmente tarde demais para ser benéfico agora, mas não é a maneira mais fácil de fazer as coisas?
fonte
O SQL Server 2017 apresenta uma nova função agregada
STRING_AGG ( expression, separator)
.Os elementos concatenados podem ser pedidos anexando
WITHIN GROUP (ORDER BY some_expression)
Para as versões 2005-2016 , normalmente uso o método XML na resposta aceita.
Isso pode falhar em algumas circunstâncias, no entanto. por exemplo, se os dados a serem concatenadas contém
CHAR(29)
você vêUm método mais robusto que pode lidar com todos os caracteres seria usar um agregado CLR. Contudo, aplicar uma ordem aos elementos concatenados é mais difícil com essa abordagem.
O método de atribuição a uma variável não é garantido e deve ser evitado no código de produção.
fonte
Dê uma olhada no projeto GROUP_CONCAT no Github, acho que faço exatamente o que você está procurando:
fonte
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
Para concatenar todos os nomes de gerente de projetos de projetos com vários gerentes de projeto, escreva:
fonte
Com o código abaixo, você deve definir PermissionLevel = External nas propriedades do seu projeto antes de implantar e alterar o banco de dados para confiar no código externo (leia em outro lugar sobre riscos e alternativas de segurança [como certificados]) executando "ALTER DATABASE database_name SET CONFIANÇA EM ".
Eu testei isso usando uma consulta que se parece com:
E produz: A, B, C, D
fonte
Tentei isso, mas para meus propósitos no MS SQL Server 2005, o seguinte foi mais útil, que encontrei no xaprb
@ Mark, como você mencionou, foi o personagem do espaço que causou problemas para mim.
fonte
Sobre a resposta de J Hardiman, que tal:
A propósito, o uso de "Sobrenome" é um erro de digitação ou não estou entendendo um conceito aqui?
Enfim, muito obrigado pessoal porque me salvou bastante tempo :)
fonte
Para meus colegas Googlers por aí, aqui está uma solução plug-and-play muito simples que funcionou para mim depois de lutar com as soluções mais complexas por um tempo:
Observe que eu tive que converter o ID em um VARCHAR para concatená-lo como uma string. Se você não precisa fazer isso, aqui está uma versão ainda mais simples:
Todo o crédito para isso vai para aqui: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- sql-server? forum = transactsql
fonte