English 中文(简体)
T-SQL While循环和连接
原标题:
  • 时间:2009-01-16 20:20:51
  •  标签:

我有一个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 是完美的。那么还有其他我错过的东西吗?

最佳回答

看起来应该能工作,但出于某种原因它似乎认为@tempCatString为空,这就是为什么你总是得到一个空值,因为空值与任何其他东西连接起来仍然是空值。建议您尝试使用COALESCE()对每个变量进行设置,以使它们为空时设置为空格。

问题回答

这将更高效。

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

select @fn

另外,请考虑使用concat_null_yields_null选项来解决您的连接问题,尽管我建议避免使用该选项。

我同意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




相关问题
热门标签