Como desenvolvedores, podemos precisar concatenar valores relacionais em uma única linha. Por exemplo, em um sistema contábil pode ser necessário listar, no histórico de um lançamento, o número das notas fiscais envolvidas, ou concatenar uma lista com o nome dos clientes que estão envolvidos em um determinado relatório.
Podemos realizar esta tarefa facilmente com um cursor, percorrendo os registros e concatenando os valores desejados. Porém os cursores podem representar um problema de performance. Assim, proponho uma alternativa: podemos realizar a mesma tarefa utilizando apenas uma variável e atribuindo os valores recursivamente à variável.
Vamos entender melhor o assunto com um exemplo. Primeiro, vamos criar uma tabela temporária com alguns valores fictícios.
CREATE TABLE #temp (
Id INT IDENTITY(1,1),
Nome VARCHAR(10)
)
INSERT #temp (Nome)
VALUES ('Rodrigo')
INSERT #temp (Nome)
VALUES ('Rafael')
INSERT #temp (Nome)
VALUES ('Wanderley')
Agora, vamos criar uma variável que receberá os valores concatenados. Lembre-se, esta variável deve ser suficientemente grande para receber os valores desejados, sem truncar os dados.
DECLARE @retstr VARCHAR(1000)
SET @retstr = NULL
E por último vamos realizar as atribuições a variável, e mostrar os resultados.
SELECT @retstr = COALESCE(@retstr + ', ','') + COALESCE(Nome,'')
FROM #temp
SELECT @retstr
DROP TABLE #temp
Observe a utilização da função COALESCE para tratamento de valores nulos. O COALESCE recebe dois valores de qualquer tipo de dado aceito pelo SQL SERVER. O valor retornado pela função será o primeiro valor NÃO NULO, entre os dois parâmetros que foram passados. Se executarmos SELECT COALESCE(NULL,’VALOR NÃO NULO’), o resultado mostrado será ‘VALOR NÃO NULO’, e se executarmos o SELECT COALESCE(‘VALOR NÃO NULO’,NULL), o mesmo resultado é apresentado: ‘VALOR NÃO NULO’.
O COALESCE é uma função de extrema importância para quem trabalha intensamente com SQL, pois permite evitar erros relacionado a cálculos com valores que não sabemos se podem estar nulos ou não.
Bom, voltando ao objetivo principal deste artigo, se você digitou corretamente os scripts acima, o resultado final será:
“Rodrigo, Rafael, Wanderley”
Até a próxima!