Question

J'ai une requête SQL qui est supposée extraire un enregistrement et la concaténer dans une chaîne, puis générer cette chaîne. La partie importante de la requête est ci-dessous.

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 est null, alors que @tempCat est toujours correct. Y a-t-il une raison pour que la concaténation ne fonctionne pas dans une boucle While? Cela semble faux, puisque l’incrémentation de @counter fonctionne parfaitement. Alors, y a-t-il autre chose qui me manque?

Était-ce utile?

La solution

On dirait que cela devrait fonctionner mais, pour une raison quelconque, il semble penser que @tempCatString est null, raison pour laquelle vous obtenez toujours une valeur null, car nullconcatenated à toute autre chose est toujours nul. Nous vous suggérons d’essayer avec COALESCE () sur chacune des variables pour les définir sur " " si elles sont nulles.

Autres conseils

cela serait plus efficace ....

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

select @fn

examinez également concat_null_yields_null comme une option permettant de résoudre votre problème de concaténation, bien que j'évite de cette manière

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

De même, la COALESCE qui remplacera la valeur NULL par "" produira effectivement des lignes vides. Je ne sais pas si vous les voulez ou non, mais si ce n'est pas simplement filtrer dans la clause WHERE ...

Enfin, vous semblez avoir une table temporaire comprenant les identifiants qui vous intéressent. Cette table peut simplement être incluse 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top