43 votes

Requête SQL - Concaténation des résultats en une seule chaîne

J'ai une fonction sql qui inclut ce code :

 DECLARE @CodeNameString varchar(100)

SELECT CodeName FROM AccountCodes ORDER BY Sort

Je dois concaténer tous les résultats de la requête select dans CodeNameString.

Évidemment, une boucle FOREACH en code C# ferait cela, mais comment le faire en SQL ?

26voto

AlexanderMP Points 6147
DECLARE @CodeNameString varchar(max)
SET @CodeNameString=''

SELECT @CodeNameString=@CodeNameString+CodeName FROM AccountCodes ORDER BY Sort
SELECT @CodeNameString

12voto

James Wiseman Points 18347

La réponse de @AlexanderMP est correcte, mais vous pouvez également envisager de gérer les valeurs NULL avec coalesce :

 declare @CodeNameString  nvarchar(max)
set @CodeNameString = null
SELECT @CodeNameString = Coalesce(@CodeNameString + ', ', '') + cast(CodeName as varchar) from AccountCodes  
select @CodeNameString

5voto

Vishal Points 4060

Pour SQL Server 2005 et versions ultérieures, utilisez Coalesce pour nulls et j'utilise Cast ou Convert s'il y a numeric values -

 declare @CodeNameString  nvarchar(max)
select  @CodeNameString = COALESCE(@CodeNameString + ',', '')  + Cast(CodeName as varchar) from AccountCodes  ORDER BY Sort
select  @CodeNameString

2voto

peter Points 21

from msdn N'utilisez pas de variable dans une instruction SELECT pour concaténer des valeurs (c'est-à-dire pour calculer des valeurs agrégées). Des résultats de requête inattendus peuvent se produire. En effet, toutes les expressions de la liste SELECT (y compris les affectations) ne sont pas garanties d'être exécutées exactement une fois pour chaque ligne de sortie

Ce qui précède semble dire que la concaténation telle que effectuée ci-dessus n'est pas valide car l'affectation peut être effectuée plus de fois qu'il n'y a de lignes renvoyées par le select

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X