2014-04-11 8 views
6

Ich versuche, eine gespeicherte Prozedur zu schreiben, und ich bekomme unerwartete Division durch 0 Ausnahmen.SQL Server Dezimalvariable Zuweisung?

Ich habe es auf das folgende Beispiel eingegrenzt.

Warum in der Welt tut dies:

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' 

Ergebnis in diesem?

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

    (1 row(s) affected) 

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

    (1 row(s) affected) 

Antwort

10

Das Problem ist, dass Sie keine Skalierung für den Typ decimal angegeben haben. Von MSDN:

s (Skala)

Die Anzahl der Dezimalstellen, die rechts von dem Komma gespeichert werden. Diese Zahl wird von p subtrahiert, um die maximale Anzahl der Ziffern links vom Dezimalpunkt zu bestimmen. Maßstab muss ein Wert von 0 bis p sein. Skalierung kann nur angegeben werden, wenn Genauigkeit angegeben ist. Die Standardskala ist 0; daher 0 < = s < = p. So

wenn Sie versuchen, @A/@B zu speichern zurück in @C, wird der Bruchteil abgeschnitten.

Hinweis:

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

eine richtige Antwort erhalten ich die OP Verwirrung sehen kann, obwohl, da Teilung zwei Dezimalstellen ohne Skala * tut * zeigt die Nachkommastellen – LittleBobbyTables

0

Dies geschieht, weil, wenn Sie Genauigkeit und Skalierung nicht erklären, ein Dezimal defualts zu (18, 0) 18 Stellen links vom Komma und 0 nach rechts.

Wenn Sie C ändern wie folgt definiert werden:

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' 

Sie sollten

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

(1 row(s) affected) 

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

(1 row(s) affected) 
Verwandte Themen