SQL查询 - 将结果连接成一个字符串[重复]

    这个问题在这里已有答案:                           如何将多行中的文本连接成SQL Server中的单个文本字符串?                                      44个答案                                    
已邀请:
如果您使用的是SQL Server 2005或更高版本,则可以使用此
FOR XML PATH & STUFF
技巧:
DECLARE @CodeNameString varchar(100)

SELECT 
   @CodeNameString = STUFF( (SELECT ',' + CodeName 
                             FROM dbo.AccountCodes 
                             ORDER BY Sort
                             FOR XML PATH('')), 
                            1, 1, '')
FOR XML PATH('')
基本上将你的字符串连接成一个长的XML结果(类似于
,code1,code2,code3
等),而
STUFF
在第一个字符处放置一个“无”字符,例如消除“多余的”第一个逗号,为您提供您可能正在寻找的结果。 更新:好的 - 我理解了注释 - 如果数据库表中的文本已经包含
<
>
&
等字符,那么我当前的解决方案实际上会将它们编码为
&lt;
&gt;
&amp;
。 如果您对XML编码有疑问 - 那么是的,您必须查看@KM提出的解决方案,该解决方案也适用于这些字符。我要提醒一句:这种方法需要更多的资源和处理密集 - 所以你知道。     
DECLARE @CodeNameString varchar(max)
SET @CodeNameString=''

SELECT @CodeNameString=@CodeNameString+CodeName FROM AccountCodes ORDER BY Sort
SELECT @CodeNameString
    
@ AlexanderMP的答案是正确的,但您也可以考虑使用
coalesce
处理空值:
declare @CodeNameString  nvarchar(max)
set @CodeNameString = null
SELECT @CodeNameString = Coalesce(@CodeNameString + ', ', '') + cast(CodeName as varchar) from AccountCodes  
select @CodeNameString
    
对于SQL Server 2005及更高版本,使用Coalesce为
nulls
,如果有
numeric values
,我使用Cast或Convert
declare @CodeNameString  nvarchar(max)
select  @CodeNameString = COALESCE(@CodeNameString + ',', '')  + Cast(CodeName as varchar) from AccountCodes  ORDER BY Sort
select  @CodeNameString
    
来自msdn不要在SELECT语句中使用变量来连接值(即,计算聚合值)。可能会发生意外的查询结果。这是因为SELECT列表中的所有表达式(包括赋值)都不能保证每个输出行只执行一次 上面似乎说上面的连接是无效的,因为赋值可能比select返回的行多做多次     
这是另一个现实生活中的例子,至少在2008版本(及更高版本)中运行良好。 这是原始查询,它使用简单的
max()
来获取至少一个值:
SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted"
FROM Value_list group by Option_name, Field_M3_name
ORDER BY option_name, Field_M3_name
改进版本,主要改进是我们以逗号分隔所有值:
SELECT from1.keys, from1.option_name, from1.Field_M3_name,

 Stuff((SELECT DISTINCT ', ' + [Option_value] FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Option values",

 Stuff((SELECT DISTINCT ', ' + CAST([Sorting] AS VARCHAR) FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Sorting"

FROM ((SELECT DISTINCT COALESCE(Option_name,'') + '|' + COALESCE(Field_M3_name,'') AS keys, Option_name, Field_M3_name FROM Value_list)
-- WHERE
) from1
ORDER BY keys
请注意,我们已经解决了我能想到的所有可能的
NULL
案例问题,并且我们修复了我们为数值(字段排序)获得的错误。     

要回复问题请先登录注册