L'assegnazione decimale t-sql cambia valore
Domanda
Perché l'istruzione select riportata di seguito restituisce due valori diversi?
declare @tempDec decimal
set @tempDec = 1.0 / (1.0 + 1.0)
select @tempDec, 1.0 / (1.0 + 1.0)
Soluzione
Va bene per valori letterali come 1.0, ma se stai estraendo i dati dalle colonne della tabella, devi convertire/convertire il primo numero valutato nella tua equazione:
convert(decimal, [col1]) / ([col2] + [col3])
-O-
convert(decimal(15, 2), [col1]) / ([col2] + [col3])
Altri suggerimenti
L'ho scoperto da un collega proprio mentre l'ho pubblicato.
Devi specificare la precisione e la scala predefinite.
Funziona in questo scenario: declare @tempDec decimale (3,2)
Da MSDN:
decimale [(p [, s])] e numerico [(p [, s])] Numeri di precisione e scala fissi. Quando si utilizza la massima precisione, i valori validi vanno da - 10 ^ 38 +1 a 10 ^ 38 - 1. I sinonimi SQL-92 per decimale sono dec e dec (p, s). numerico è funzionalmente equivalente al decimale.
p (precisione) Il numero totale massimo di cifre decimali che è possibile memorizzare, sia a sinistra che a destra del punto decimale. La precisione deve essere un valore compreso tra 1 e la precisione massima di 38. La precisione predefinita è 18.
s (scala) Il numero massimo di cifre decimali che è possibile memorizzare a destra del punto decimale. La scala deve essere un valore compreso tra 0 e p. La scala può essere specificata solo se è stata specificata la precisione. La scala predefinita è 0; pertanto, 0 < = s < = p. Le dimensioni massime di archiviazione variano in base alla precisione.