如何在不使用游标的情况下将表的一列转换为SQL Server中的csv字符串

Kyl*_*est 15 t-sql sql-server

我想select Column from Table使用SQL Server 将结果返回到逗号分隔的字符串中.

有问题的列相当大(nvarchar(2000)),因此解决方案必须能够处理非常大的结果值.

Mar*_*ell 28

DECLARE @result nvarchar(max)
SET @result = ''

SELECT @result = @result + [Column] + N','
FROM [TABLE]

--TODO: trim last ',' if you require

PRINT @result
Run Code Online (Sandbox Code Playgroud)

如果Column可以为null,则先排除它,或使用ISNULL/ COALESCE- 否则单个NULL将中断整个序列.用以下方法排除它更有效WHERE:

SELECT @result = @result + [Column] + N','
FROM [TABLE]
WHERE [Column] IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

  • SELECT @result = COALESCE(@result + N',',N'')+ [Column]将避免最后一个没有perf惩罚的逗号. (8认同)
  • 像宣传的那样工作.谢谢.对于那些以后可能会发现这个的人来说,很容易敲掉最后一个逗号:`select @result = substring(@result,1,(LEN(@result)-1)) (2认同)

Mic*_*uen 10

没有尾随逗号版本:

declare @s varchar(max);

select @s = isnull(@s + ', ' + lastname, lastname)
from person
order by lastname;

print @s;
Run Code Online (Sandbox Code Playgroud)


kar*_*ato 7

我在建议的答案中讨论的方法有问题。我从 SQLAuthority 获取了代码。但是如果您有问题建议的解决方案,这每次都有效

SELECT SUBSTRING(
(SELECT ',' + s.ColumnName
FROM dbo.table s
ORDER BY s.ColumnName
FOR XML PATH('')),2,200000) AS CSV
GO
Run Code Online (Sandbox Code Playgroud)


Nat*_*ith 5

在SQL 2017中添加了STRING_AGG

https://docs.microsoft.com/zh-cn/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

SELECT STRING_AGG (ColumnName, ',') AS csv 
FROM TableName
GROUP BY ColumnName2
Run Code Online (Sandbox Code Playgroud)

  • 为了胜利!谢谢。 (2认同)