当两个不同数据类型的值放在一起进行算术运算时,SQL Server会自动将值转换为特定的数据类型。例如。
DECLARE @d NUMERIC(9,6);
SET @d = 1.0;
SELECT @d/3;
GO
结果0.33333333。这种转换背后的内部逻辑是什么?数据类型之间是否存在某种“等级”(转换将发生在哪个“方向”)?
发布于 2011-04-08 02:34:15
请参阅: msdn.microsoft.com上的Data Type Precedence (for SQL-Server 2000)
来自与SQL-Server 2008相同的页面
当运算符组合两个不同数据类型的表达式时,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。
如果转换不是a支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,操作的结果将具有该数据类型。
SQL Server对数据类型使用以下优先顺序:
有关何时两个操作数都是char、varchar、binary或varbinary表达式,以及何时它们都是具有不同精度或小数位数的小数位数,以及何时它们都是具有不同精度或小数位数的小数位数,请参阅:Precision, Scale, and Length
下面的SO问题/答案也是相关的:sql-server-truncates-decimal-points-of-a-newly-created-field-in-a-view
发布于 2011-04-08 02:34:59
由于分子和分母都是整数,因此结果将是整数。您需要将两个值中的一个转换为十进制值:
Select @i / 3.0
Data Type Conversion (Database Engine)
CAST and CONVERT (Transact-SQL)
具体地说,请注意有关隐式数据类型转换的部分。在您的示例中,由于所有类型都属于同一类型,因此不存在转换。尽管Cast/Convert文章介绍了这些函数,但它也概述了隐式转换。
https://stackoverflow.com/questions/5585796
复制相似问题