Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
A idéia é criar uma função de usuário para mascarar/formatar valores numéricos e monetários direto no SQL.
create FUNCTION FormataValor(@Valor Decimal(18,4),@SepMilhar char(1),@SepDecimal Char(1))Returns Varchar(50) ASBegin Declare @Inteiro int, @Texto varchar(50), @ValorDecimal varchar(04) Set @Texto = RTrim(Cast(@Valor as varchar(50))) Set @Inteiro = Cast(@Valor as Integer) Set @ValorDecimal = SubString(@Texto,Len(@Texto)-3,4) If Len(@Inteiro) = 4 Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,1) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal If Len(@Inteiro) = 5 Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,2) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal If Len(@Inteiro) = 6 Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal Return @TextoEndPara utlizá-la:
SELECT dbo.FormataValor(2560.69,'.',',')
OBS: sempre utilizar o . (ponto) como separador de decimal.
Espero que possa ser útil a alguém.
Fonte/Autor/link
AUTOR: Adaptei esta função de um post do forum imasters (do qual não tenho o link). Caso alguém seja o autor favor postar o link para que os créditos possam ser atribuido.
Dúvidas, criticas, contribuições, correções e adições serão bem vindas.
If Len(@Inteiro) = 8
Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,2) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),3,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),6,7) + @SepDecimal + @ValorDecimal
If Len(@Inteiro) = 9
Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),3,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),7,7) + @SepDecimal + @ValorDecimal
Caras, extremamente útil a informação.
Muito obrigado!
Olá. Tomei a liberdade de melhorar a function do colega acima e corrigir um erro pra valores com 6 casas.
Agora está funcionando perfeitamente, segundo meus testes.
Abraço
create FUNCTION FormataValor(@Valor Numeric(18,4),@SepMilhar char(1),@SepDecimal Char(1))
Returns Varchar(50) AS
Begin
Declare @Inteiro int,
@Texto varchar(50),
@ValorDecimal varchar(04)
Set @Texto = RTrim(Cast(@Valor as varchar(50)))
Set @Inteiro = Cast(@Valor as Integer)
Set @ValorDecimal = SubString(@Texto,Len(@Texto)-3,2)
If Len(@Inteiro) = 1
Set @Texto = Cast(@Inteiro as varchar(10)) + Replace(@SepMilhar, '.',',') + @ValorDecimal
If Len(@Inteiro) = 2
Set @Texto = Cast(@Inteiro as varchar(10)) + Replace(@SepMilhar, '.',',') + @ValorDecimal
If Len(@Inteiro) = 3
Set @Texto = Cast(@Inteiro as varchar(10)) + Replace(@SepMilhar, '.',',') + @ValorDecimal
If Len(@Inteiro) = 4
Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,1) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal
If Len(@Inteiro) = 5
Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,2) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),3,5) + @SepDecimal + @ValorDecimal
If Len(@Inteiro) = 6
Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),4,7) + @SepDecimal + @ValorDecimal
If Len(@Inteiro) = 7
Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,1) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),5,7) + @SepDecimal + @ValorDecimal
Return @Texto
End
--para chamar a function
--SELECT dbo.FormataValor(1234567.99,'.',',')