2009-01-16 9 views
1

J'ai une requête SQL qui est supposée extraire un enregistrement et concaténer chacun d'entre eux à une chaîne, puis générer cette chaîne. La partie importante de la requête est ci-dessous.T-SQL While Loop et concaténation

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 

Lorsque le script est exécuté, @tempCatString sorties comme nulle en @tempCat sorties toujours correctement. Y at-il une raison pour que la concaténation ne fonctionne pas dans une boucle While? Cela semble faux, puisque l'incrémentation @counter fonctionne parfaitement. Y a-t-il autre chose qui me manque?

Répondre

4

On dirait que cela devrait fonctionner, mais pour Parfois, il semble penser que @tempCatString est nul, c'est pourquoi vous obtenez toujours une valeur nulle car nullconcatenated à quoi que ce soit d'autre est encore null. Suggère que vous essayez avec COALESCE() sur chacune des variables de les mettre à "" si elles sont nulles.

+0

l'une des valeurs du tableau que j'Interrogation était nulle, donc l'ajout d'un IsNull() à la déclaration de @tempCatString a résolu le problème. Merci – JustinT

3

ce serait plus efficace ....

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

select @fn 

Regardez aussi concat_null_yields_null en option pour résoudre votre problème de concaténation, bien que je voudrais éviter cette route

1

Je suis d'accord avec keithwarren, mais je serais toujours sûr d'ajouter une clause ORDER BY à la requête. Vous pouvez alors être sûr de l'ordre exact dans lequel les valeurs sont concaténées.

De même, le COALESCE pour remplacer la valeur NULL par '' donnera effectivement des lignes vides. Je ne sais pas si vous les voulez ou pas, mais si ce n'est pas juste filtre dans la clause WHERE à la place ...

Enfin, vous semblez avoir une table temporaire, y compris les ID qui vous intéressent. Ce tableau peut juste être inclus dans un JOIN pour filtrer la table source ...

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