sexta-feira, 29 de junho de 2012

DECODE ZERO NO SQL SERVER


Segue um script para simular uso da função DECODE do SGBDR Oracle, nesta function, adaptei para situação em que o valor for zero,
por exemplo uma situação em que tem que dividir um valor por zero.

IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N'[dbo].[usf_decode_zero]') 
               AND type IN (N'FN')
           )
   DROP FUNCTION usf_decode_zero;
  
GO

CREATE FUNCTION usf_decode_zero(@param1 float, @param2 float) RETURNS float AS
-- Nome Artefato/Programa..: usf_decode_zero.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 28/06/2012
-- Data Atualizacao........: 28/06/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function)  verifica se o valor do primeiro parametro é igual a zero, retornando o valor do 
-- ........................:  segundo parametro2, semalhante a função decode do Oracle, porém simplificado.
-- OBS.....................: O primeiro parametro é um float, retorna o valor do segundo parametro que também é flaot, caso o primeiro 
-- ........................:  parametro seja igual a zero, caso contrário retorna o valor do primeiro parametro.
-- ........................: 
--  
BEGIN
    RETURN 
      (

   SELECT CASE WHEN @param1 = 0 THEN 
        @param2 
      ELSE 
        @param1
       END AS usf_decode_zero
   ) 

END;
GO
-- exemplo do uso da function 
SELECT dbo.usf_decode_zero (0,1200);     --Retorno: 1200
SELECT dbo.usf_decode_zero (1100,1);     --Retorno: 1100
SELECT dbo.usf_decode_zero (NULL,1);     --Retorno: NULL

-- exemplo tratando, o erro de divisão por zero, Mensagem 8134 (CLÁSSICA)
SELECT 2400/dbo.usf_decode_zero(0,1);    --Retorno: 2400
SELECT 2400/dbo.usf_decode_zero(2400,1); --Retorno: 1
SELECT 2400/dbo.usf_decode_zero(NULL,1); --Retorno: NULL


Nenhum comentário:

Postar um comentário