2011-01-25 53 views
6

在SQL Server 2008上,我试图将所有选定值的逗号分隔列表变为变量。将sql值连接到变量

SELECT field 
FROM table 

回报:

+-------+ 
| field | 
+-------+ 
| foo | 
+-------+ 
| bar | 
+-------+ 

我想获得: “富,酒吧,”

我想:

DECLARE @foo NVARCHAR(MAX) 
SET @foo = '' 

SELECT @foo = @foo + field + ',' 
FROM TABLE 

PRINT @foo 

它返回什么。我究竟做错了什么?

+2

您的表是否包含任何空值? –

回答

8

你需要改变的NULL

SELECT @foo = @foo + ISNULL(field + ',', '') 
FROM TABLE 

或删除这些

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field IS NOT NULL 
+1

哦,亲爱的,匿名downvote ... – gbn

+0

我希望我能再次upvote,因为它是一个完美的答案。 – VoodooChild

3

如果您的表中甚至有一个NULL字段,则会发生这种情况。在SQL Server中,NULL + <any> = NULL。要么忽略它们

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field is not null 

或解决他们

SELECT @foo = @foo + isnull(field + ',', '') 
FROM TABLE 

你可以写,而不领先SET语句这是比较常见的,整个事情。下面这个查询返回“富,酒吧”,没有尾随逗号

DECLARE @foo NVARCHAR(MAX) 
SELECT @foo = isnull(@foo + ',', '') + field 
FROM TABLE 
WHERE field is not null 

PRINT @foo 
+0

我不会推荐使用这种方法,因为它不可靠。更多信息[执行计划和聚合级联查询的结果取决于表达式位置](https://support.microsoft.com/en-us/kb/287515)和[nvarchar并置/索引/ nvarchar(max)莫名行为]( http://stackoverflow.com/questions/15138593/nvarchar-concatenation-index-nvarcharmax-inexplicable-behavior) – lad2025

+0

它确实在所示的表格中可靠地工作,即没有ORDER BY。如果没有订单,变量会不断增加,在处理结束时,它仍然是最终结果。当ORDER BY发挥作用时,查询执行将被强制保留一个虚拟临时数据集,每个行中都有一个临时值“@ var”。在这些“瞬时行”上发生排序后,“@ variable”状态的某些历史版本会被打印为赋值的最终值。故事的道德是 - 不要使用ORDER BY,或使用FOR XML。 – RichardTheKiwi

1

不要忘记使用LTRIMRTRIM约在@foo(当数据类型是char/varchar)在连接其他它不会给予预期的结果ts在SQL 2008 R2中。