尽管已经为该问题添加了出色的答案,但是对于SQL Server中的数据类型转换,还是有一个明确定义的优先顺序。
当运算符组合两个不同数据类型的表达式时,数据类型优先级规则将指定优先级较低的数据类型转换为优先级较高的数据类型。如果该转换不是受支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,运算结果将具有该数据类型。
SQL Server对数据类型使用以下优先顺序:
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)
所以,举例来说,如果你SELECT 0.5 * 1
(乘以一个int小数),你得到的转换为十进制值的结果,因为decimal
是更高的优先级比int
数据类型。
有关更多详细信息,请参见http://msdn.microsoft.com/zh-cn/library/ms190309.aspx。
说了这么多,实际上SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
应该返回一个十进制值,因为实际上所有输入都是十进制的。有趣的是,您可以将结果修改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));
返回:
我很茫然,解释如何使任何差异,但显然它。我的猜测是函数中的1E0
(显式浮点数)POWER(
迫使SQL Server在POWER
函数的输出类型上做出不同的选择。如果我的假设正确,那将表明POWER
函数中可能存在错误,因为文档指出第一个输入为POWER()
浮点数或可以隐式转换为浮点数的数字。