Banco de Dados

5 mai, 2009

Concatenando valores sem utilizar cursores no MS-SQL Server

Publicidade

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!