SQL Server:算术运算中的数据类型“rank”?

时间:2011-04-07 18:29:18

标签: sql sql-server sql-server-2005 sql-server-2008 types

当两个具有不同数据类型的值组合在一起进行算术运算时,SQL Server会自动将值转换为某种数据类型。 E.g。

DECLARE @d NUMERIC(9,6);
SET @d = 1.0;
SELECT @d/3;
GO

结果0.33333333。这种转换背后的内部逻辑是什么?数据类型之间是否存在某种“等级”(转换将发生在哪个“方向”)?

2 个答案:

答案 0 :(得分:4)

请参阅msdn.microsoft.com上的Data Type Precedence (for SQL-Server 2000)

来自SQL-Server 2008的同一页:

  

当操作员组合两个时   不同数据类型的表达式,   数据类型优先级的规则   用数据类型指定   较低的优先级转换为   优先级较高的数据类型。

     

如果 转换不 支持隐式转化,则会返回错误。当两个操作数表达式具有相同的数据时   类型,操作的结果有   那种数据类型。

     

SQL Server使用以下内容   数据类型的优先顺序:

     
      
  1. 用户定义的数据类型(最高
  2.   
  3. SQL_VARIANT
  4.   
  5. XML
  6.   
  7. DATETIMEOFFSET
  8.   
  9. DATETIME2
  10.   
  11. 日期时间
  12.   
  13. SMALLDATETIME
  14.   
  15. 日期
  16.   
  17. 时间
  18.   
  19.   
  20.   
  21. 小数
  22.   
  23.   
  24. SMALLMONEY
  25.   
  26. BIGINT
  27.   
  28. INT
  29.   
  30. SMALLINT
  31.   
  32. TINYINT
  33.   
  34.   
  35. NTEXT
  36.   
  37. 文本
  38.   
  39. 图像
  40.   
  41. 时间戳
  42.   
  43. 唯一标识符
  44.   
  45. nvarchar(包括nvarchar(max))
  46.   
  47. 的nchar
  48.   
  49. varchar(包括varchar(max))
  50.   
  51.   
  52. varbinary(包括varbinary(max))
  53.   
  54. 二进制(最低
  55.   

有关两个操作数何时是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文章是关于这些函数的,但它也概述了隐式转换。