Domanda

Ho una query SQL che dovrebbe estrarre un record e concatenerlo su una stringa, quindi generare quella stringa. La parte importante della query è di seguito.

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

Quando viene eseguito lo script, @tempCatString viene visualizzato come null mentre @tempCat viene sempre visualizzato correttamente. C'è qualche ragione per cui la concatenazione non funzionerà all'interno di un ciclo While? Sembra sbagliato, poiché l'incremento di @counter funziona perfettamente. Quindi c'è qualcos'altro che mi manca?

È stato utile?

Soluzione

Sembra che dovrebbe funzionare, ma per qualche motivo sembra pensare che @tempCatString sia null, motivo per cui si ottiene sempre un valore null poiché nullconcatenato a qualsiasi altra cosa è ancora null. Suggerisci di provare con COALESCE () su ciascuna delle variabili per impostarle su " & Quot; se sono nulli.

Altri suggerimenti

questo sarebbe più efficiente ....

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

select @fn

guarda anche concat_null_yields_null come un'opzione per risolvere il tuo problema di concatenazione, anche se eviterei quella rotta

Sono d'accordo con keithwarren, ma sarei sempre sicuro di aggiungere una clausola ORDER BY alla query. Puoi quindi essere sicuro dell'esatto ordine in cui vengono concatenati i valori.

Inoltre, COALESCE per sostituire il valore NULL con '' produrrà effettivamente righe vuote. Non so se li vuoi o no, ma se non semplicemente filtri nella clausola WHERE invece ...

Infine, sembra che tu abbia una tabella temporanea che include gli ID che ti interessano. Questa tabella può essere semplicemente inclusa in un JOIN per filtrare la tabella di origine ...

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top