A pesar de las excelentes respuestas ya agregadas a esta pregunta, existe un orden de precedencia explícitamente definido para la conversión de tipos de datos en SQL Server.
Cuando un operador combina dos expresiones de diferentes tipos de datos, las reglas para la precedencia del tipo de datos especifican que el tipo de datos con la precedencia más baja se convierte al tipo de datos con la precedencia más alta. Si la conversión no es una conversión implícita compatible, se devuelve un error. Cuando ambas expresiones de operando tienen el mismo tipo de datos, el resultado de la operación tiene ese tipo de datos.
SQL Server usa el siguiente orden de precedencia para los tipos de datos:
user-defined data types (highest)
sql_variant
xml
datetimeoffset
datetime2
datetime
smalldatetime
date
time
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar (including nvarchar(max) )
nchar
varchar (including varchar(max) )
char
varbinary (including varbinary(max) )
binary (lowest)
Entonces, por ejemplo, si usted SELECT 0.5 * 1
(multiplicando un decimal por un int) obtiene un resultado que se convierte en un valor decimal, ya que decimal
tiene mayor prioridad que el int
tipo de datos.
Consulte http://msdn.microsoft.com/en-us/library/ms190309.aspx para obtener más detalles.
Habiendo dicho todo eso, probablemente SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
debería devolver un valor decimal, ya que prácticamente todas las entradas son decimales. Curiosamente, puede forzar un resultado correcto modificando eso SELECT
para:
DECLARE @N INT = 360;
DECLARE @I DECIMAL(38,26) = 0.15 * 30 / 360;
DECLARE @C DECIMAL(38,26) = 1000000;
SELECT @C * @I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1);
SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1E0 + @I, @N) - 1));
Esto devuelve:
No puedo explicar cómo eso hace alguna diferencia, aunque claramente lo hace . Mi conjetura es el 1E0
(un flotador explícita) en las POWER(
fuerzas de función de SQL Server para tomar una decisión diferente en los tipos de salida para la POWER
función. Si mi suposición es correcta, eso indicaría un posible error en la POWER
función, ya que la documentación indica que la primera entrada POWER()
es un flotante, o un número que puede convertirse implícitamente en un flotante.