T-SQL While Loop y concatenación
-
19-08-2019 - |
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?
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