Eh bien, je préfère MONEY
! C'est un octet moins cher que d' DECIMAL
, et les calculs à effectuer plus rapidement, car (sous les couvertures) l'addition et la soustraction des opérations sont essentiellement les opérations sur entiers. @SQLMenace est l'exemple—c'est un grand avertissement pour les inconscients—pourraient également être appliquées à l' INT
egers, où le résultat serait de zéro. Mais ce n'est aucune raison de ne pas utiliser les nombres entiers—le cas échéant.
Donc, il est parfaitement sûr et approprié d'utiliser MONEY
quand ce que vous faites affaire avec est - MONEY
et l'utiliser selon les règles mathématiques qu'il suit (même en tant que INT
eger).
Il aurait été mieux si SQL Server promu de division et de multiplication des MONEY
's en DECIMAL
s (ou FLOAT
s?)—peut-être, mais ils n'ont pas choisi de le faire; et ils n'ont pas choisi de promouvoir INT
egers d' FLOAT
s lors de la division.
MONEY
n'a pas de question de précision; que DECIMAL
s pour avoir un plus grand type intermédiaire utilisé lors des calculs est juste une "fonction" de l'utilisation de ce type (et je ne suis pas vraiment sûr de savoir comment loin que "la fonctionnalité" se prolonge).
Pour répondre à la question spécifique, une "raison impérieuse"? Eh bien, si vous voulez le maximum absolu de la performance en SUM(x)
où x
peut être soit en DECIMAL
ou MONEY
, alors MONEY
auront un avantage.
Aussi, n'oubliez pas qu'il est plus petit cousin, SMALLMONEY
—seulement 4 octets, mais il n'maximum en 214,748.3647
- ce qui est assez petit pour de l'argent—et donc n'est pas souvent un bon ajustement.
Pour prouver le point autour de l'utilisation de plus grands types intermédiaires, si vous attribuez l'intermédiaire explicitement à une variable, DECIMAL
souffre du même problème:
declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)
select @a = 100, @b = 339, @c = 10000
set @d = @a/@b
set @d = @d*@c
select @d
Produit 2950.0000
(bon, au moins, DECIMAL
arrondi plutôt que d' MONEY
tronquée—même comme un entier.)