我有一个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
非常有效。那么我还缺少其他东西吗?
答案 0 :(得分:4)
看起来它应该可以工作,但是对于某些原因,似乎认为@tempCatString为null,这就是为什么你总是得到一个空值,因为nullconcatenated到其他任何东西仍然是null。建议您在每个变量上使用COALESCE()
尝试将它们设置为“”,如果它们为空。
答案 1 :(得分:3)
这会更有效率....
select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...
select @fn
同时将concat_null_yields_null视为修复连接问题的选项,尽管我会避免使用该路径
答案 2 :(得分:1)
我同意keithwarren,但我总是一定要在查询中添加一个ORDER BY子句。然后,您可以确定这些值的连接顺序。
此外,用''替换NULL值的COALESCE将有效地产生空行。我不知道你是否想要它们,但如果不只是在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