T-SQL While循环和字符串连接

5

我有一个SQL查询,它应该提取一条记录并将每个连接成一个字符串,然后输出该字符串。查询的重要部分如下所示:

DECLARE @counter int;
SET @counter = 1;

DECLARE @tempID varchar(50);
SET @tempID = '';

DECLARE @tempCat varchar(255);
SET @tempCat = '';

DECLARE @tempCatString varchar(5000);
SET @tempCatString = '';

WHILE @counter <= @tempCount
BEGIN

    SET @tempID = (
    SELECT [Val]
    FROM #vals
    WHERE [ID] = @counter);

    SET @tempCat = (SELECT [Description] FROM [Categories] WHERE [ID] = @tempID);
    print @tempCat;

    SET @tempCatString = @tempCatString + '<br/>' + @tempCat;
    SET @counter = @counter + 1;

END

当脚本运行时,@tempCatString 的输出为 null,而 @tempCat 总是能够正确输出。在 While 循环内部进行字符串拼接有什么原因导致无法正常工作吗?这似乎是不正确的,因为递增 @counter 可以完美地工作。那么我还有其他遗漏的地方吗?
3个回答

7

看起来应该工作的,但由于某种原因它似乎认为@tempCatString为null,这就是为什么你总是得到一个空值,因为与null连接的任何其他东西仍然是null。建议尝试对每个变量使用COALESCE()将它们设置为“”(空字符串),如果它们为null。


我查询的表中有一个值为空,因此在@tempCatString声明中添加IsNull()函数解决了问题。谢谢。 - JustinT

5

这样做会更加高效....

select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...

select @fn

此外,可以考虑将concat_null_yields_null作为解决拼接问题的选项,但我会避免使用该选项。

1

我同意keithwarren的观点,但我会确保在查询中添加ORDER BY子句。这样你就可以确定值被连接的确切顺序。

此外,使用COALESCE替换NULL值为''将有效地产生空行。我不知道你是否想要它们,但如果不想要,只需在WHERE子句中进行过滤即可...

最后,你似乎有一个包含你感兴趣的ID的临时表。这个表可以直接包含在JOIN中以过滤源表...

DELCARE @output VARCHAR(8000)
SET @output = ''

SELECT
    @output = @output + [Categories].Description + '<br/>'
FROM
    Categories
INNER JOIN
    #vals
        ON #vals.val = [Categories].ID
WHERE
   [Categories].Description IS NOT NULL
ORDER BY
   [Categories].Description

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接