t-sql怎么运作? SELECT @MyList = ISNULL(@MyList,'')+ Title +','FROM Titles

时间:2011-10-19 16:20:04

标签: sql tsql recursion

我遇到了一些非常酷的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

3 个答案:

答案 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;
}