Informado sobre um problema em um processo de ETL, verifiquei que um determinado campo no arquivo de origem, que esperava-se ser numérico, muitas vezes continha caracteres não numéricos como barras, traços ou vírgulas e em algumas situações caracteres não esperados.
Alguns analistas criaram “ajustes” para cada um dos caracteres possíveis:
( ISNUMERIC(REPLACE(SUBSTRING(nu_cpf_cnpj, 3, 14),'-','')) = 0
OR ISNUMERIC(REPLACE(SUBSTRING(nu_cpf_cnpj, 3, 14),'/','')) = 0 )
Porém como o número de caracteres inesperados acabou crescendo, e o nível de stress na operação aumentou, pensei em uma solução mais definitiva, através de uma função que retorna apenas os números de um VARCHAR.
create function dbo.f_SomenteNumeros(@valor varchar(25))
returns varchar(MAX)
as
begin
declare @resultado varchar(MAX)
declare @i int
declare @length int
select
@resultado=''
,@i=0
while @i<len(@valor)+1
begin
if substring(@valor,@i,1) in ('0','1','2','3','4','5','6','7','8','9')
select @resultado=@resultado+substring(@valor,@i,1)
select @i=@i+1
end
return @resultado
end
GO
select dbo.f_SomenteNumeros('a*&%¨*&¨1')
Até a próxima!
Olá, sou iniciante em sql e não entendi como você faz para usar a função com uma coluna da tabela
ResponderExcluirexemplo, tabela teste e coluna cep
ficaria assim ?
select dbo.f_SomenteNumeros(teste.cep) ?
Isso mesmo Colega.
ResponderExcluirConsiderando o exemplo da tabela 'teste' coluna 'cep', ficaria assim
Select
dbo.f_SomenteNumeros(t.cep)
from
teste t
Att.
Parabéns Rodrigo!
ResponderExcluirEra exatamente o que eu estava tentando fazer e fiquei agarrado ao tentar elaborar a solução.
Obrigado por compartilhar o seu conhecimento!
[ ]s,
Cristiano Coelho de Lima