当两个具有不同数据类型的值组合在一起进行算术运算时,SQL Server会自动将值转换为某种数据类型。 E.g。
DECLARE @d NUMERIC(9,6);
SET @d = 1.0;
SELECT @d/3;
GO
结果0.33333333。这种转换背后的内部逻辑是什么?数据类型之间是否存在某种“等级”(转换将发生在哪个“方向”)?
答案 0 :(得分:4)
请参阅msdn.microsoft.com上的Data Type Precedence (for SQL-Server 2000)
来自SQL-Server 2008的同一页:
当操作员组合两个时 不同数据类型的表达式, 数据类型优先级的规则 用数据类型指定 较低的优先级转换为 优先级较高的数据类型。
如果 转换不 支持隐式转化,则会返回错误。当两个操作数表达式具有相同的数据时 类型,操作的结果有 那种数据类型。
SQL Server使用以下内容 数据类型的优先顺序:
- 用户定义的数据类型(最高)
- SQL_VARIANT
- XML
- DATETIMEOFFSET
- DATETIME2
- 日期时间
- SMALLDATETIME
- 日期
- 时间
- 浮
- 实
- 小数
- 钱
- SMALLMONEY
- BIGINT
- INT
- SMALLINT
- TINYINT
- 位
- NTEXT
- 文本
- 图像
- 时间戳
- 唯一标识符
- nvarchar(包括nvarchar(max))
- 的nchar
- varchar(包括varchar(max))
- 炭
- varbinary(包括varbinary(max))
- 二进制(最低)
醇>
有关两个操作数何时是char,varchar,binary或varbinary表达式的各种详细信息,它们是连接或比较的,当它们都是具有不同精度或比例的小数时,请参阅:Precision, Scale, and Length
以下SO问题/答案也是相关的:sql-server-truncates-decimal-points-of-a-newly-created-field-in-a-view
答案 1 :(得分:0)
由于分子和分母都是整数,因此结果将是整数。您需要将两者中的一个转换为十进制值:
Select @i / 3.0
Data Type Conversion (Database Engine)
CAST and CONVERT (Transact-SQL)
具体来说,请注意有关隐式数据类型转换的部分。在您的示例中,由于所有类型都是相同类型,因此没有转换。虽然Cast / Convert文章是关于这些函数的,但它也概述了隐式转换。