2014-04-11 9 views
6

Sto provando a scrivere una procedura memorizzata e sto ottenendo dividendo imprevisto per 0 eccezioni.Assegnazione decimale della variabile SQL Server?

L'ho ristretto al seguente esempio.

Perché nel mondo fa questo:

declare @A decimal; 
    declare @B decimal; 
    declare @C decimal; 

    set @A = 4; 
    set @B = 9; 
    set @C = @A/@B 

    select @A/@B as 'Expected' 
    select @C as 'Wut' 

risultato in questo?

Expected 
    --------------------------------------- 
    0.4444444444444444444 

    (1 row(s) affected) 

    Wut 
    --------------------------------------- 
    0 

    (1 row(s) affected) 

risposta

10

Il problema è che non è stata specificata una scala per il tipo decimal. Da MSDN:

s (scala)

Il numero di cifre decimali che verranno memorizzati alla destra del punto decimale. Questo numero viene sottratto da p per determinare il numero massimo di cifre a sinistra del punto decimale. La scala deve essere un valore compreso tra 0 e p. La scala può essere specificata solo se viene specificata la precisione. La scala predefinita è 0; pertanto, 0 < = s < = p.

Così, quando si tenta di memorizzare @A/@B nuovamente dentro @C, la parte frazionaria ottiene troncato.

Avviso:

declare @A decimal(18, 3); 
declare @B decimal(18, 3); 
declare @C decimal(18, 3); 

set @A = 4; 
set @B = 9; 
set @C = @A/@B 

select @A/@B -- 0.44444444444444444444 
select @C -- 0.444 
+5

posso vedere la confusione del PO, però, dal momento che divide due decimali senza scala * fa * mostra i decimali – LittleBobbyTables

0

Questo sta accadendo, perché se non si dichiara la precisione e la scala, un numero decimale defualts a (18, 0) 18 cifre a sinistra del punto decimale, e da 0 a destra.

Se si cambia C da definire in questo modo:

declare @A decimal; 
declare @B decimal; 
declare @C decimal (18, 9); 

set @A = 4; 
set @B = 9; 
set @C = @A/@B 

select @A/@B as 'Expected' 
select @C as 'Wut' 

si dovrebbe ottenere una risposta adeguata

Expected 
--------------------------------------- 
0.4444444444444444444 

(1 row(s) affected) 

Wut 
--------------------------------------- 
0.444444444 

(1 row(s) affected)