SQL Server While循环不返回预期值

时间:2012-07-11 14:25:33

标签: sql-server function

这里是我的函数代码:

-- Get Country Names
DECLARE getCountriesName CURSOR FOR
    SELECT c.Name
    FROM VocabCountry c
        RIGHT OUTER JOIN ProjectCountryRelations cr
            ON cr.CountryId = c.Id
    WHERE 
        c.Id = @project_id;

-- Finally Create list to return 
OPEN getCountriesName;
FETCH NEXT FROM getCountriesName INTO @Name;
WHILE @@FETCH_STATUS = 0
BEGIN  

    SET @listOfItems = @listOfItems + @Name + ', '
    FETCH NEXT FROM getCountriesName INTO @Name;

END;
CLOSE getCountriesName;
DEALLOCATE getCountriesName;

我期待一个逗号分隔值的列表,例如,如下:

Canada, United States of America,

我确认SELECT会返回预期的国家/地区。

感谢您的帮助!

埃里克

2 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2008 或更新版本,您可以使用一个SELECT和一些FOR XML PATH魔法轻松完成此操作: - )

SELECT 
    STUFF(
       (SELECT ',' + c.Name
        FROM VocabCountry c
        RIGHT OUTER JOIN ProjectCountryRelations cr
        ON cr.CountryId = c.Id
        FOR XML PATH('')
       ), 1, 1, '')

这应该为您返回以逗号分隔的国家/地区名称列表。不需要丑陋和可怕的光标!

答案 1 :(得分:2)

使用FOR XML PATH将使用逗号连接值。

使用STUFF函数将删除您不想要的第一个逗号。

所以使用这个:

SELECT 
    STUFF(
       (SELECT ',' + c.Name
        FROM VocabCountry c
        RIGHT OUTER JOIN ProjectCountryRelations cr
        ON cr.CountryId = c.Id
        WHERE cr.Id = @project_id
        FOR XML PATH('')
       ), 1, 1, '');

看到这个小提琴:http://sqlfiddle.com/#!3/fd648/21