Bueno, me gusta MONEY! Es un byte más barato que DECIMAL, y los cálculos se realizan más rápido porque (debajo de las cubiertas) las operaciones de suma y resta son esencialmente operaciones enteras. El ejemplo de @ SQLMenace, que es una gran advertencia para los que no lo saben, podría aplicarse igualmente a los INTegers, donde el resultado sería cero. Pero esa no es razón para no usar números enteros, cuando corresponda .
Por lo tanto, es perfectamente 'seguro' y apropiado usarlo MONEYcuando se trata de MONEYeso y usarlo de acuerdo con las reglas matemáticas que sigue (igual que INTeger).
¿Hubiera sido mejor si SQL Server promoviera la división y la multiplicación de MONEY's en DECIMALs (o FLOATs)? Posiblemente, pero no eligieron hacer esto; ni eligieron promover INTegers a FLOATs al dividirlos.
MONEYno tiene problemas de precisión; eso DECIMALde tener un tipo intermedio más grande usado durante los cálculos es solo una 'característica' de usar ese tipo (y en realidad no estoy seguro de hasta qué punto se extiende esa 'característica').
Para responder a la pregunta específica, ¿una "razón convincente"? Bueno, si desea un rendimiento máximo absoluto en un lugar SUM(x)donde xpodría ser DECIMALo MONEY, entonces MONEYtendrá una ventaja.
Además, no olvide que es un primo más pequeño, de solo SMALLMONEY4 bytes, pero tiene un máximo de 214,748.3647, que es bastante pequeño para el dinero, y por lo tanto no suele ser una buena opción.
Para probar el punto usando tipos intermedios más grandes, si asigna el intermedio explícitamente a una variable, DECIMALsufre el mismo problema:
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
Produce 2950.0000(bueno, al menos DECIMALredondeado en lugar de MONEYtruncado, igual que un entero).
DECIMAL(19, 4)es una opción popular, verifique esto también marque aquí Formatos de moneda mundial para decidir cuántos lugares decimales usar, la esperanza ayuda.