Malgré les excellentes réponses déjà ajoutées à cette question, il existe un ordre de priorité explicitement défini pour la conversion des types de données dans SQL Server.
Lorsqu'un opérateur combine deux expressions de types de données différents, les règles de priorité des types de données spécifient que le type de données avec la priorité la plus faible est converti en type de données avec la priorité la plus élevée. Si la conversion n'est pas une conversion implicite prise en charge, une erreur est renvoyée. Lorsque les deux expressions d'opérande ont le même type de données, le résultat de l'opération a ce type de données.
SQL Server utilise l'ordre de priorité suivant pour les types de données:
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)
Ainsi, par exemple, si vous SELECT 0.5 * 1
(en multipliant une décimale par un int) vous obtenez un résultat qui est converti en une valeur décimale, car la priorité decimal
est plus élevée que le int
type de données.
Voir http://msdn.microsoft.com/en-us/library/ms190309.aspx pour plus de détails.
Cela dit, cela SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
devrait probablement renvoyer une valeur décimale, car pratiquement toutes les entrées sont décimales. Fait intéressant, vous pouvez forcer un résultat correct en le modifiant SELECT
pour:
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));
Cela renvoie:
Je n'arrive pas à expliquer en quoi cela fait une différence, bien que ce soit clairement le cas . Ma supposition est que 1E0
(un flottant explicite) dans la POWER(
fonction force SQL Server à faire un choix différent sur les types de sortie pour la POWER
fonction. Si ma supposition est correcte, cela indiquerait un bogue possible dans la POWER
fonction, puisque la documentation indique que la première entrée de POWER()
est un flottant, ou un nombre qui peut être implicitement converti en flottant.