【发布时间】:2011-12-11 02:14:09
【问题描述】:
我遇到了一些非常酷的 t-sql,它可以从一个 t-sql 查询中的选定行生成一个以逗号分隔的列值列表:
SELECT @MyList = ISNULL(@MyList,'') + Title + ', ' FROM Titles
但我不知道它是如何工作的。不知何故,它必须进行递归调用,但我不知道如何。 任何人都可以向我解释或给我发送一个解释它的链接吗? 要查看它是否有效,请使用以下脚本:
CREATE TABLE Titles(
Title varchar(50)
)
insert Titles values ( 'Doctor')
insert Titles values ( 'Nurse')
insert Titles values ( 'Administrator')
insert Titles values ( 'CMA')
select * from Titles
DECLARE @MyList VARCHAR(1000)
SET @MyList = ''
SELECT @MyList = ISNULL(@MyList,'') + Title + ', ' FROM Titles
SELECT @MyList
【问题讨论】:
-
想象一下数据库引擎遍历
Titles的每一行。如果它为每一行执行@MyList = ...赋值,@MyList最终会得到什么值?这里没有递归。 -
不是一个真正的答案,但我可以建议另一种方法吗? SELECT STUFF(( SELECT ',' + Title FROM Titles t FOR XML PATH('') ), 1, 1, '')。它不需要变量声明,因此可以在单个查询中使用。
-
您可能会在使用此方法时遇到问题,尤其是在您按计算结果排序时。 The correct behaviour for an aggregate concatenation query is undefined.