Na minha base de dados GUIADBA, existe uma tabela tb_Funcionario que possui uma coluna salário do tipo money.
Precisei fazer uma carga de dados a partir de uma planilha onde a informação de valores vem de uma coluna do tipo texto. Nesse caso, eu teria que tratar muitos casos antes de inserir, então usei o Convert varchar para money.
Se o valor da planilha vier ‘1054,30’, ao converter isso diretamente para money, o resultado virá errado:
select convert(money, '1054,30')
Para solucionar o problema, criei uma função para converter campo do tipo texto em campo de tipo numérico, afim de preencher uma tabela onde a coluna é do tipo de dados money.
Alguns tipos de dados não foram tratados e eu considerei que quando não fosse numérico o valor seria igual a 0.
Por exemplo: Valor = ‘1..000,0’ , ‘1.000,,0’, ‘1000,.00’ ou ‘1.,000,00’
Considerei esses valores como não conforme e retornei como 0(zero).
Use guiadba go if object_id('dbo.fx_Convert_Money')is not null Drop Function dbo.fx_Convert_Money Go Create Function dbo.fx_Convert_Money (@valor varchar(20)) Returns money As Begin if(charindex(',',reverse(@valor))=3 And charindex(',',@valor)=3) Begin Select @valor = replace(@valor,substring(@valor,1, charindex(',',@valor)),substring(@valor,1, charindex(',',@valor)-1)+'') End if (charindex(',',reverse(@valor))=3 And Len(@valor)>5) Begin Select @valor = replace(@valor,substring(@valor,1, charindex(',',@valor)),substring(@valor,1, charindex(',',@valor)-1)+'.') End if (charindex('.',@valor)=2) Begin Select @valor = replace(@valor,substring(@valor,1, charindex('.',@valor)),substring(@valor,1, charindex('.',@valor)-1)+'') End if (charindex('.',@valor)=3 And Len(@valor)>5) Begin Select @valor = replace(@valor,substring(@valor,1, charindex('.',@valor)),substring(@valor,1, charindex('.',@valor)-1)+',') End if(charindex(',',reverse(@valor))=3 Or len(@valor)=5) Begin Select @valor = replace(@valor,',','.') End Select @valor = replace(replace(@valor,'R$',''),'$','') Select @valor = replace(replace(replace( replace(replace(@valor,'-',''),'\',''), '/',''),';',''),':','') Select @valor = replace(replace(@valor,'?',''),'!','') Select @valor = ltrim(rtrim(@valor)) if (isnumeric(@valor) = 0) Begin Select @valor = 0 End Return @valor End
Gostou deste artigo? Então você vai gostar do treinamento Guia DBA que vai tornar você um especialista em otimização, clique aqui e adquira o “Curso SQL Server 2014” e receba também “O passo a passo para otimização”.