我遇到了一些非常酷的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
答案 0 :(得分:3)
作业:
@MyList = ISNULL(@MyList,'') + Title + ', '
对标题表的每一行评估。它将每行的Title
列值连接到@MyList。
仅需要测试ISNULL(@MyList,'')
,因此@MyList
如果为NULL
,则以空字符串开头。在您的示例中,ISNULL
是不必要的,因为@MyList显式设置为空字符串。
答案 1 :(得分:2)
其他答案解释了为什么这会构建逗号分隔列表。您会注意到最后会有一个额外的逗号,如果您愿意,可以在之后删除。如果您使用的是SQL Server 2005或更高版本,则可以使用COALESCE
而不是以逗号结尾:
SELECT @MyList = COALESCE(@MyList + ', ','') + Title FROM Titles
对于第一行,@MyList
将为NULL
,因此@MyList + ', '
将评估为NULL
,而COALESCE
将返回''
。基本上,处理第一行是这样的:
SELECT @MyList = '' + Title
对于后续行,COALESCE
将返回@MyList + ', '
,您将获得相应的
SELECT @MyList = @MyList + ', ' + Title
。
答案 2 :(得分:1)
表Titles
包含一组预定义的标题,因此查询
SELECT @MyList = ISNULL(@MyList,'') + Title + ', ' FROM Titles
追加表Titles
中每个行的标题列的值。
这相当于以下循环:
// Actually ISNULL(@MyList,'') does initialize
// @MyList by empty string whilst processing the first row in tsql query
string myList = "";
foreach(string title in Titles)
{
myList = myList + ', ' + title;
}