SQL Server: тип данных "ранг" в арифметических операциях? - PullRequest
1 голос
/ 07 апреля 2011

Когда два значения с разными типами данных объединяются для арифметической операции, SQL Server автоматически преобразует значения в определенный тип данных.Например,

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

Результаты 0.33333333.Какая внутренняя логика стоит за этим преобразованием?Есть ли какой-то «ранг» между типами данных (в какое «направление» произойдет преобразование)?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011

См .: Приоритет типа данных (для SQL-Server 2000) на msdn.microsoft.com

С той же страницы для SQL-Server 2008 :

Когда оператор объединяет два выражения разных типов данных, правила для приоритета типа данных указать, что тип данных с более низкий приоритет преобразуется в тип данных с более высоким приоритетом.

Если преобразование не a не поддерживается неявное преобразование, возвращается ошибка . Когда оба выражения операнда имеют одинаковые данные типа, результат операции имеет этот тип данных.

SQL Server использует следующее порядок приоритета для типов данных:

  1. пользовательские типы данных ( наибольший )
  2. sql_variant
  3. XML
  4. DateTimeOffset
  5. datetime2
  6. Дата и время
  7. smalldatetime
  8. дата
  9. время
  10. поплавок
  11. реальный
  12. 1049 * десятичного *
  13. деньги
  14. smallmoney
  15. BIGINT
  16. INT
  17. SMALLINT
  18. TINYINT
  19. немного
  20. NTEXT
  21. текст
  22. изображение
  23. 1071 * Отметка времени *
  24. UniqueIdentifier
  25. nvarchar (включая nvarchar (max))
  26. NCHAR
  27. varchar (включая varchar (max))
  28. символ
  29. varbinary (включая varbinary (max))
  30. двоичный ( минимальный )

Для получения более подробной информации о том, когда оба операнда являются выражениями char, varchar, binary или varbinary, и они связаны или сравниваются, и когда они оба являются десятичными с разной точностью или масштабом, см .: Precision, Scale и Length

Следующий вопрос / ответ SO также имеет отношение: sql-server-truncates-decimal-a-недавно созданное поле в виде

0 голосов
/ 07 апреля 2011

Поскольку числитель и знаменатель являются целыми числами, результатом будет целое число. Вам необходимо преобразовать одно из двух значений в десятичное значение:

Select @i / 3.0

Преобразование типов данных (компонент Database Engine)

CAST и CONVERT (Transact-SQL)

В частности, обратите внимание на разделы о неявном преобразовании типов данных. В вашем примере, поскольку все типы имеют одинаковый тип, преобразование не выполняется. Хотя статья Cast / Convert посвящена этим функциям, она также описывает неявные преобразования.

...