none
Problema Function RRS feed

  • Pergunta

  •  

    E ae Pessoal, to um um problema "estranho"

     

    Qdo rodo uma funcão ele retornar erro de divizao por zero.

     

    Ae eu pego a funcao, e rodo o código dela ele roda sem problema.

     

    alguem pode dar uma ajuda ae.

    segunda-feira, 4 de agosto de 2008 13:19

Todas as Respostas

  • Tem como vc postar o código para poder ajudar

    segunda-feira, 4 de agosto de 2008 13:23
  • Exemplo1

    Contornando Divisão por zero

     

    --Inserindo dados na tabela

    declare @t table (id int identity(1,1), num1 int, num2 int)
    insert @t
              select 4, 2
    union all select 8, 2
    union all select 2, null
    union all select 1, 0

    --calculando
    select *, case when isnull(num2, 0) = 0 then 0 else num1/num2 end as xxxx from @t

     

     

    Exemplo2

     

    CREATE TABLE dbo.Products
        (
      Product VARCHAR(10),
      Price NUMERIC(7, 2),
      CostPrice NUMERIC(7, 2)
        )


    INSERT dbo.Products SELECT 'Hammer', 12.00, 6.00
    INSERT dbo.Products SELECT 'Nails',  0.10, 0.05
    INSERT dbo.Products SELECT 'Screws', 0, 0.05


    SELECT Product, (CostPrice / Price) * 100 AS PercentProfit FROM dbo.Products

     

    Erro:

     

    (3 row(s) affected)

    Server: Msg 8134, Level 16, State 1, Line 1
    Divide by zero error encountered.


    SELECT Product, (CostPrice / NULLIF(Price, 0))* 100 AS PercentProfit FROM dbo.Products

     

    Retorna:

     

    Product    PercentProfit          
    ---------- -----------------------
    Hammer     50.0000000000
    Nails      50.0000000000
    Screws     NULL

    (3 row(s) affected)

     

     

    Espero ter ajudado

    Abraço

    Gilmar

    segunda-feira, 4 de agosto de 2008 16:55
  • Boa Tarde,

     

    Possivelmente alguma opção ANSI está sendo sobrescrita (ou na sua sessão ou durante a criação da function). Veja os exemplos abaixo (SQL 2005):

     

    Code Snippet

    -- Possivelmente gera um erro

    SELECT 10 / 0

    -- Não gera um erro e retorna nulo

    SET ARITHIGNORE OFF

    SET ARITHABORT OFF

    SET ANSI_WARNINGS OFF

    SELECT 10 / 0

     

     

    Em todo caso, acho que prevenir é melhor do que remediar, teste sempre se o denominador é zero antes de fazer a divisão. Não é uma boa prática confiar nas configurações da conexão.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 4 de agosto de 2008 17:19
  • Gustavo,

     

    Concordo com você.

     

    segunda-feira, 4 de agosto de 2008 17:21