2014-04-11 18 views
6

Próbuję napisać procedurę przechowywaną i otrzymuję nieoczekiwany podział przez 0 wyjątków.Przypisanie zmiennej dziesiętnej SQL Server?

Zawęziłem to do następującego przykładu.

Dlaczego w świecie robi to:

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' 

wynik w tym?

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

    (1 row(s) affected) 

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

    (1 row(s) affected) 

Odpowiedz

10

Problem polega na tym, że nie określono skali dla typu decimal. Od MSDN:

s (skala)

liczbę cyfr dziesiętnych, które będą przechowywane na prawo od kropki dziesiętnej. Ta liczba jest odejmowana od p, aby określić maksymalną liczbę cyfr po lewej stronie separatora dziesiętnego. Skala musi mieć wartość od 0 do p. Skalę można określić tylko wtedy, gdy określono precyzję. Domyślna skala to 0; dlatego 0 < = s < = s.

Więc podczas próby do przechowywania @A/@B powrotem do @C, część ułamkowa zostanie obcięta.

Wskazówka:

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

widzę zamieszanie PO, choć, ponieważ iloraz dwóch miejsc po przecinku bez skali * robi * pokazuje miejsca dziesiętne – LittleBobbyTables

0

Dzieje się tak, ponieważ jeśli nie deklarują precyzji i skali, ułamek dziesiętny defualts do (18, 0) 18 cyfr po lewej stronie przecinka dziesiętnego i 0 do prawej.

Jeżeli zmienisz C należy zdefiniować tak:

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' 

Należy uzyskać właściwą odpowiedź

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

(1 row(s) affected) 

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

(1 row(s) affected)