TSQL Арифметическое переполнение с использованием BIGINT

Может кто-нибудь пояснить мне, почему я получаю сообщение об ошибке, когда пытаюсь установить переменную @a в приведенном ниже примере?

DECLARE @a BIGINT
SET @a = 7*11*13*17*19*23*29*31
/*
ERROR:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
*/

Что я мог выяснить, пока теперь, внутренне, SQL начинает выполнять математические вычисления, оценивая умножение и помещая временный результат в INT, затем преобразует его в BIGINT.

Однако, если я добавлю 1.0 * в свой список чисел, ошибки нет, поэтому я считаю, что на данный момент SQL использует float как временный результат, а затем преобразует его в BIGINT

DECLARE @b BIGINT
SET @b =   1.0  *  7*11*13*17*19*23*29*31
/*
NO ERROR
*/

Честно говоря, я не вижу ничего плохого в коде ... это так просто. ..

[Я использую SQL 2008]

[EDIT]

Спасибо Натану за ссылку . Это хорошая информация, о которой я не знал, но я до сих пор не понимаю, почему я получаю сообщение об ошибке и почему у меня есть "уловки", чтобы заставить такой простой скрипт работать.

Это то, что я должен как программист знает, что делать?

Или это ошибка, и если да, то я буду считать этот вопрос закрытым.

7
задан leoinfo 16 February 2011 в 17:03
поделиться