2009-01-16 54 views
1

我有一個應該拿出一個記錄和Concat的每一個字符串的SQL查詢,然後輸出字符串。查詢的重要部分如下。T-SQL While循環和串聯

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輸出爲空而@tempCat總是正確輸出。有沒有什麼理由在一個While循環內連接不起作用?這似乎是錯誤的,因爲遞增@counter完美。那麼還有什麼我失蹤的?

回答

4

看起來它應該工作,但對於somereason它似乎認爲@tempCatString爲null,這就是爲什麼你總是得到一個空值,因爲nullconcatenated任何其他東西仍然是空的。建議您在每個變量上使用COALESCE()嘗試將它們設置爲「」,如果它們爲空。

+0

表I中查詢值中的一個值爲null,因此向@tempCatString聲明中添加IsNull()可修復此問題。謝謝 – JustinT 2009-01-16 20:38:04

3

這將是更有效....

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

select @fn 

還看CONCAT_NULL_YIELDS_NULL作爲一個選項,以解決您的拼接問題,但我會避免這條道路

1

我同意keithwarren,但我會始終確保BY子句添加命令來查詢。然後,你可以肯定,究竟什麼樣的順序值在被連接在一起。

此外,聚結以取代「」 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