sábado, 27 de setembro de 2008

Ms SQL Server - Função para abreviar nome próprio

O problema é o seguinte:
Alguém "fez" o banco de um jeito onde o nome completo das pessoas está em apenas um registro.
Como exemplo temos a tabela pessoas e o campo nome que tem o nome completo. Seu diretor quer que as correspondências sejam enviadas com o nome abreviado e mandou criar o campo nome_abreviado no banco para isso. Como colocar os nomes abreviados nesse caso?
Use essa função para isso:

--Ajustar abreviação (criar função)
--drop function dbo.Abrevia; --Remover a função caso necessário
CREATE FUNCTION dbo.Abrevia
( @nome varchar(120) )
RETURNS varchar(25)
AS
BEGIN
declare @aux varchar(120)
declare @aux2 varchar(25)
declare @fim varchar(25)

set
@fim=left(@nome,charindex(' ',@nome)) --Pegar o primeiro nome
set @aux=@fim --Inicializa variável
set @aux2='' --Inicializa variável
while len(@aux)>0 --Enquanto tem nomes do meio
begin
set @aux=left(@nome,charindex(' ',@nome)) --pega primeiro nome
set @nome=ltrim(replace(@nome,@aux,'')) --remove primeiro nome
if charindex(' ',@nome)>4--exclui de,da,dos(da silva, dos santos..)
begin
set @aux2=@aux2+substring(@nome,1,1)+'. ' --Abrevia com .
end
end
select @fim=@fim+@aux2+@nome --concatena tudo(primeiro nome+abreviações+último nome)
RETURN ( @fim )
END
GO

--Verificar nomes
select --top 10
nome,nome_abreviado,
dbo.Abrevia(nome) teste_funcao
from pessoas
where tipo=2 --Pessoas físicas
order by nome

--Ajustar nomes abreviados (update)
update pessoas set nome_abreviado=dbo.Abrevia(nome)
where tipo=2 --Pessoas físicas

Resultado:
nome | nomereduzido | teste_funcao
Abadia da Silva Naves | NULL | Abadia S. Naves

É isso aí, deve ter jeitos mais elegantes de fazer isso mas na pressa foi a solução que encontrei.
Fique à vontade para alterá-la de acordo com suas necessidades e não esqueça de comentar caso seja útil!

Um comentário:

Rafael Botas disse...

Olá pessoal,,,,tudo bem???

To começando a trabalhar com SQL Server, antes eu trabalhava com Oracle....e tem uma função que não tem no Sql e preciso fazer em Function...O que acontece.... como que eu faço um Update na tabela dentro de uma função ? é possivel isso? abrass