Как сервер SQL определяет тип данных столбца, полученного с помощью выражения - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть заявление sql

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

Выше UNIT - это int, В x_table я вижу, что UNITS - это DECIMAL (38,9).Как SQL Server пришел к этому конкретному типу данных.Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019
  • Все операнды должны быть преобразованы в тип данных с наивысшим приоритетом .В этом случае UNIT и литерал 100 будут преобразованы в DECIMAL(p, s).
  • CAST(RATIO AS DECIMAL(18,5)), конечно, DECIMAL(18,5)
  • (CAST(RATIO AS DECIMAL(18,5))/100), это DECIMAL(22,9) - это соответствует правиламдля результата деления здесь с 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) с использованием правил умножения из вышеприведенной ссылки и UNIT, рассматриваемое как DECIMAL(10,0)
  • SUM(UNIT *ISNULL((CAST(RATIO AS DECIMAL(18,5))/100),1)), равно DECIMAL(38,9) как результирующий тип из SUM - десятичная дробь всегда имеет точность 38 и исходный масштаб .
0 голосов
/ 11 февраля 2019

Ссылки и комментарии выше объяснят КАК , но если вам нужен быстрый ответ или подтверждение, используйте 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 )  
...