Nonostante le eccellenti risposte già aggiunte a questa domanda, esiste un ordine di precedenza esplicitamente definito per la conversione dei tipi di dati in SQL Server.
Quando un operatore combina due espressioni di diversi tipi di dati, le regole per la precedenza del tipo di dati specificano che il tipo di dati con la precedenza inferiore viene convertito nel tipo di dati con la precedenza più alta. Se la conversione non è una conversione implicita supportata, viene restituito un errore. Quando entrambe le espressioni di operando hanno lo stesso tipo di dati, il risultato dell'operazione ha quel tipo di dati.
SQL Server utilizza il seguente ordine di precedenza per i tipi di dati:
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)
Così, per esempio, se si SELECT 0.5 * 1
(moltiplicando un numero decimale da un int) si ottiene un risultato che viene convertito in un valore decimale, dal momento che decimal
è più alta la precedenza rispetto al int
tipo di dati.
Vedere http://msdn.microsoft.com/en-us/library/ms190309.aspx per ulteriori dettagli.
Detto questo, probabilmente SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
dovrebbe restituire un valore decimale, poiché praticamente tutti gli input sono decimali. È interessante notare che puoi forzare un risultato corretto modificandolo SELECT
in:
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));
Questo ritorna:
Sono in perdita per spiegare come ciò faccia la differenza, anche se chiaramente lo fa . La mia ipotesi è che 1E0
(un float esplicito) nella POWER(
funzione costringe SQL Server a fare una scelta diversa sui tipi di output per la POWER
funzione. Se la mia supposizione è corretta, ciò indicherebbe un possibile bug nella POWER
funzione, poiché la documentazione indica che il primo input in POWER()
è un float o un numero che può essere implicitamente convertito in un float.