#SQLServer – Concatenação sem #Cursor, usando o #coalesce – #sql #dicas #microsoft

#SQLServer – Concatenação sem #Cursor, usando o #coalesce – #sql #dicas #microsoft

Já algum tempo foi divulgada esta excelente alternativa para concatenação de valores de texto para o Microsoft SQL Server. Não sei quem iniciou com essa ideia e nem sei quem publicou primeiro, só sei que não fui eu! Rsrs… Mas por isso, não vou colocar os créditos desse artigo para ninguém (nem para mim mesmo) já que tantas pessoas postaram sobre isso. Chega de bla, bla, bla; vamos ao que interessa.

Você já deve ter passado por uma situação em que precisou concatenar valores de texto de uma mesma coluna de uma tabela ou view do seu banco SQL Server. Normalmente a alternativa mais conhecida é o cursor; porém, além do cursor ter um enorme gasto de processamento, é uma ferramenta que nem todos os programadores dominam perfeitamente. Vamos citar o exemplo abaixo, usando cursor, em que criamos uma tabela tb_exemploSQL com a coluna nome. Então você concatenará e armazenará em uma variável e exibirá na tela:

–Criamos aqui a tabela tb_exemploSQL

create table tb_exemploSQL (

nome varchar(50)

)

–Aqui inserimos alguns valores para exemplo

insert into tb_exemploSQL values (‘nome1’),(‘nome2’),(‘nome3’),(‘nome4’),(‘nome5’)

–Essa é a variável que armazenará os nomes

declare @nomesConcatenados varchar(8000)

–Inicializa a variável

select @nomesConcatenados = ”

–Variável auxiliar para receber o valor do cursor

declare @nomes as varchar(50)

–Declara o cursor

declare c_cursorConcatenacao cursor for

select

nome

from

tb_exemploSQL

–Abre o cursor

open c_cursorConcatenacao

–Insere o valor do primeiro registro na variável

fetch next from c_cursorConcatenacao into @nomes

–Enquanto não o fetch for válido, então concatenar

while @@FETCH_STATUS = 0

begin

select @nomesConcatenados = @nomesConcatenados + @nomes + ‘,’

–Insere o valor do primeiro registro na variável

fetch next from c_cursorConcatenacao into @nomes

end

–Fecha o cursor

close c_cursorConcatenacao

–Desaloca o cursor

deallocate c_cursorConcatenacao

–Retira a última vírgula

select @nomesConcatenados = substring(@nomesConcatenados,1,LEN(@nomesConcatenados)-1)

–Aqui é exibido os valores concatenados

select @nomesConcatenados as nomesConcatenados

–Exclui a tabela

drop table tb_exemploSQL

Para o coalesce é necessário muito menos processamento e menos código. Veja abaixo:

–Criamos aqui a tabela tb_exemploSQL

create table tb_exemploSQL (

nome varchar(50)

)

–Aqui inserimos alguns valores para exemplo

insert into tb_exemploSQL values (‘nome1’),(‘nome2’),(‘nome3’),(‘nome4’),(‘nome5’)

–Essa é a variável que armazenará os nomes

declare @nomesConcatenados varchar(8000)

–A consulta abaixo fará com a variável armazene os valores

select

@nomesConcatenados = coalesce(@nomesConcatenados,@nomesConcatenados,”) + nome + ‘,’

from

tb_exemploSQL

–Retira a última vírgula

select @nomesConcatenados = substring(@nomesConcatenados,1,LEN(@nomesConcatenados)-1)

–Aqui é exibido os valores concatenados

select @nomesConcatenados as nomesConcatenados

–Exclui a tabela

drop table tb_exemploSQL

Em ambas o resultado é o mesmo: ‘nome1,nome2,nome3, nome4, nome5’

Agora vamos entender um pouco sobre o coalesce para entender como conseguimos concatenar rapidamente. O coalesce recebe três valores, no primeiro passamos a variável que irá receber o valor resultante da função, o segundo e terceiro valor são para comparação, no qual o “maior” é o resultado retornado.

No caso da nossa rotina, como o primeiro valor da variável é NULL, pois não inicializamos então o resultado é um texto vazio concatenado com o nome e vírgula. Do segundo em diante, como o valor já vai acumular não serão inseridos mais valores vazios, mas os valores retornados pela consulta.

Espero que esse artigo tenha ajudado a diminuir alguns processamentos por conta de simples concatenamentos.

Abraço! Até a próxima!

Anúncios

Uma resposta em “#SQLServer – Concatenação sem #Cursor, usando o #coalesce – #sql #dicas #microsoft

  1. Existe uma forma ainda mais fácil de se fazer, basta substituir:

    select

    @nomesConcatenados = coalesce(@nomesConcatenados,@nomesConcatenados,”) + nome + ‘,’

    from

    tb_exemploSQL

    por

    select

    @nomesConcatenados = IsNull(@nomesConcatenados,”) + nome + ‘,’

    from

    tb_exemploSQL

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s