Ungeachtet der hervorragenden Antworten, die dieser Frage bereits hinzugefügt wurden, gibt es eine explizit definierte Rangfolge für die Konvertierung von Datentypen in SQL Server.
Wenn ein Operator zwei Ausdrücke unterschiedlicher Datentypen kombiniert, geben die Regeln für die Priorität des Datentyps an, dass der Datentyp mit der niedrigeren Priorität in den Datentyp mit der höheren Priorität konvertiert wird. Wenn die Konvertierung keine unterstützte implizite Konvertierung ist, wird ein Fehler zurückgegeben. Wenn beide Operandenausdrücke denselben Datentyp haben, hat das Ergebnis der Operation diesen Datentyp.
SQL Server verwendet die folgende Rangfolge für Datentypen:
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)
Wenn Sie beispielsweise SELECT 0.5 * 1
eine Dezimalstelle mit einem Int multiplizieren, erhalten Sie ein Ergebnis, das in einen Dezimalwert konvertiert wird, da decimal
es eine höhere Priorität als der int
Datentyp hat.
Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/ms190309.aspx .
Trotzdem SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
sollte wahrscheinlich ein Dezimalwert zurückgegeben werden, da praktisch alle Eingaben dezimal sind. Interessanterweise können Sie ein korrektes Ergebnis erzwingen, indem Sie Folgendes ändern SELECT
:
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));
Dies gibt zurück:
Ich kann nicht erklären, wie das einen Unterschied macht, obwohl dies eindeutig der Fall ist . Ich vermute, dass der 1E0
(explizite Gleitkommawert) in der POWER(
Funktion SQL Server dazu zwingt, eine andere Auswahl für die Ausgabetypen für die POWER
Funktion zu treffen . Wenn meine Vermutung richtig ist, würde dies auf einen möglichen Fehler in der POWER
Funktion hinweisen , da in der Dokumentation angegeben ist, dass die erste Eingabe POWER()
ein Float oder eine Zahl ist, die implizit in einen Float konvertiert werden kann.