SQL 服务器如何确定通过表达式派生的列的数据类型

How does SQL server determine the data type of a column derived through an expression

我有一个sql声明

> SELECT SUM(UNIT*ISNULL((CAST(RATIO AS DECIMAL(18,5))/100),1)) AS UNITS
> into x_table from some_table

以上单位为整型, 在 x_table 中,我可以看到 UNITS 是 DECIMAL(38,9)。 sql 服务器如何获得该特定数据类型。 谢谢!

上面的链接和评论将解释 HOW,但如果您需要快速回答或确认,请使用 sp_describe_first_result_setsys.dm_exec_describe_first_result_set()

通知我删除了INTO ...

例子

Declare @tsql nvarchar(max) =  N'SELECT SUM(UNIT*ISNULL((CAST(RATIO AS DECIMAL(18,5))/100),1)) AS UNITS from some_table'

exec sp_describe_first_result_set @tsql 

--------
-- OR --
--------

select column_ordinal
      ,name
      ,system_type_name 
 From  sys.dm_exec_describe_first_result_set(@tsql,null,null )  
  • 所有操作数必须转换为datatype with highest precedence。在这种情况下,我们会将 UNIT 和文字 100 转换为 DECIMAL(p, s).
  • CAST(RATIO AS DECIMAL(18,5))当然是DECIMAL(18,5)
  • (CAST(RATIO AS DECIMAL(18,5))/100)DECIMAL(22,9) - 这遵循除法 here 的结果规则,其中 100 被视为 DECIMAL(3,0)
  • ISNULL((CAST(RATIO AS DECIMAL(18,5))/100),1)DECIMAL(22,9),因为 ISNULL 始终采用其第一个参数的数据类型。
  • UNIT *ISNULL((CAST(RATIO AS DECIMAL(18,5))/100),1)DECIMAL(33,9) 使用上述 link 的乘法规则, UNIT 被视为 DECIMAL(10,0)
  • SUM(UNIT *ISNULL((CAST(RATIO AS DECIMAL(18,5))/100),1))DECIMAL(38,9) 作为 SUM-ming a decimal always has 38 precision and the original scale.
  • 的结果类型