Esta dica vai para todos os colegas que trabalham com SQL Server e precisam trabalhar arredondamentos. Creio que a maioria dos programadores sql conhecem a funcao ROUND() que faz o arredondamento de casas decimais de um determinado numero. Porem, ha alguns dias atras, precisei de um resultado um pouco diferente... como estamos alterando algumas funcoes que envolvem a emissao de nota fiscal eletronica, o tratamento aplicado nos valores exigiu uma extensao do comando ROUND() que talvez muita gente nao conheca, mas extremamente util. Em uma nova fiscal eletronica, todos os valores unitarios devem conter 4 casas decimais. Porem os totais e valores de impostos devem ser apenas com 2 casas. E tem mais um detalhe: na multiplicacao da quantidade pelo valor unitario, o valor total nao deve ser arredondado, e sim ter seus decimais truncados. Exemplo: original = 2,4567arredondado = 2,46truncado = 2,45 Ja vi muitos codigos inusitados para realizar esta tarefa. Funcoes cabulosas e cheias de if. Mas aqui vai a dica, vamos entender melhor o comando round(): - Sintaxe ROUND (numeric_expression , length [ ,function ] )- Argumentos numeric_expression E uma expressao da categoria de tipo de dados numericos exatos ou aproximados, com excecao do tipo de dados bit. length E a precisao a qual a numeric_expression deve ser arredondada. length deve ser uma expressao do tipo tinyint, smallint ou int. Quando length for um numero positivo, numeric_expression e arredondada para o numero de posicoes decimais especificado por length. Quando length for um numero negativo, numeric_expression e arredondada no lado esquerdo do ponto decimal, conforme especificado por length. function E o tipo de operacao a ser executada. function deve ser tinyint, smallintou int. Quando function e omitido ou tem um valor 0 (padrao), a numeric_expression e arredondada. Quando um valor diferente de 0 e especificado, numeric_expression e truncado.(fonte: msdn) Veja um exemplo abaixo: declare @vl decimal(19,9) select @vl = 2.4567 select convert(decimal(12, 2), round(@vl, 2)) as 'arredondado' , convert(decimal(12, 2), round(@vl, 2, 1)) as 'truncado' , convert(decimal(12, 2), @vl) as 'convertido' Coloquei tambem uma terceira coluna, onde somente converto para decimal(12,2), porem o SQL por padrao arredonda. A forma mais eficiente e atraves do comando Round(). Thats all folks! As vezes, e necessario realizar operacoes de dados entre diferentes bancos de dados dentro de uma instancia SQL. Na verdade, isso e muito comum. Entao aqui vai a dica. 1a opcao: Buscando os dados de um outro banco de dados ao qual voce esta contectado: update ocrd set ocrd.cardname = ocrd2.cardname from sboatlantida..ocrd ocrd2 where ocrd.cardcode = ocrd2.cardcodeNeste exemplo, especificamos a tabela que sera atualizada logo apos o update, um alias para a tabela do banco onde vamos pegar os dados (ocrd2) e na clausula where, fazemos a correlacao entre as tabelas.2a opcao: Realizando update em outro banco de dados: update ocrd1 set ocrd1.cardname = ocrd2.cardname from atl..ocrd ocrd1 inner join SBOAtlantida..ocrd ocrd2 on ocrd1.cardcode = ocrd2.cardcodeJa este exemplo, estamos atualizando o banco de dados ATL atraves de dados provenientes do banco SBOAtlantida. Para iniciantes, pode parecer estranho especificar na clausula FROM (da onde) qual a tabela a ser atualizada. Mas