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_set
或 sys.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. 的结果类型
我有一个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_set
或 sys.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. 的结果类型