SQL查询 - 将结果连接成一个字符串

Mat*_*nes 36 sql t-sql sql-server sql-function

我有一个包含以下代码的sql函数:

DECLARE @CodeNameString varchar(100)

SELECT CodeName FROM AccountCodes ORDER BY Sort
Run Code Online (Sandbox Code Playgroud)

我需要将select查询中的所有结果连接到CodeNameString中.

显然,C#代码中的FOREACH循环会这样做,但我如何在SQL中执行此操作?

mar*_*c_s 83

如果您使用的是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, '')
Run Code Online (Sandbox Code Playgroud)

FOR XML PATH('')基本符连接你的字符串连成一片,长XML结果(像,code1,code2,code3等)和STUFF上置"无"字的第一个字符,如抹了"多余的"第一个逗号,给你,你很可能结果寻找.

更新: OK -我理解的意见-如果你的数据库表中的文本中包含的字符,如<,>&,然后我目前的解决方案实际上将这些编码成&lt;,&gt;&amp;.

如果您对XML编码有疑问 - 那么是的,您必须查看@KM提出的解决方案,该解决方案也适用于这些字符.我要提醒一句:这种方法需要更多的资源和处理密集 - 所以你知道.

  • **这将无法正确处理XML特殊字符(`<`,`&`,`>`等)**,就像我之前的回答一样,请看这里:http://stackoverflow.com/questions/5031204/does -t-SQL具有-一个聚集型函数到串连串/ 5031297#5031297 (16认同)
  • @ jnm2:是的,我希望微软会听,最后给我们一个**内置的**(和优化!)函数来处理这个.... (2认同)

Ale*_*rMP 25

DECLARE @CodeNameString varchar(max)
SET @CodeNameString=''

SELECT @CodeNameString=@CodeNameString+CodeName FROM AccountCodes ORDER BY Sort
SELECT @CodeNameString
Run Code Online (Sandbox Code Playgroud)


Jam*_*man 10

@ AlexanderMP的答案是正确的,但您也可以考虑使用以下方法处理空值coalesce:

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


Vis*_*hal 5

对于 SQL Server 2005 及更高版本,请使用Coalesce for nulls,如果有,我使用Cast 或 Convertnumeric values -

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