Pregunta

Tengo una consulta SQL que se supone que debe extraer un registro y concatenar cada uno a una cadena, luego generar esa cadena. La parte importante de la consulta se encuentra a continuación.

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

Cuando se ejecuta el script, @tempCatString sale como nulo mientras que @tempCat siempre sale correctamente. ¿Hay alguna razón por la que la concatenación no funcione dentro de un bucle While? Eso parece incorrecto, ya que incrementar @counter funciona perfectamente. Entonces, ¿hay algo más que me falta?

¿Fue útil?

Solución

Parece que debería funcionar, pero por alguna razón parece pensar que @tempCatString es nulo, por lo que siempre se obtiene un valor nulo, ya que nulo concatenado con cualquier otra cosa sigue siendo nulo. Sugiero que pruebe con COALESCE () en cada una de las variables para establecerlas en " " si son nulos.

Otros consejos

esto sería más eficiente ...

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

select @fn

también mire concat_null_yields_null como una opción para solucionar su problema de concatenación, aunque evitaría esa ruta

Estoy de acuerdo con keithwarren, pero siempre me aseguro de agregar una cláusula ORDER BY a la consulta. Entonces puede estar seguro de exactamente en qué orden se concatenan los valores.

Además, la COALESCE para reemplazar el valor NULL con '' generará efectivamente filas en blanco. No sé si los quieres o no, pero si no, simplemente filtra la cláusula WHERE en su lugar ...

Finalmente, parece que tiene una tabla temporal que incluye los ID que le interesan. Esta tabla solo se puede incluir en JOIN para filtrar la tabla fuente ...

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top