TSQL de dépassement de capacité Arithmétique à l'aide de BIGINT

Quelqu'un peut-il préciser pour moi pourquoi j'ai une erreur quand j'essaie de définir la variable @un dans l'exemple ci-dessous?

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.
*/

Ce que j'ai pu trouver jusqu'à maintenant, c'est que, en interne, SQL commence à faire le calcul de l'évaluation de la multiplication et de placer le résultat temporaire dans un INT alors qu'il jette à un BIGINT.

Cependant, si j'ajoute un 1.0 * à ma liste de nombres, il n'y a pas d'erreur, donc je crois que pour cette fois, SQL utilise flotter comme un résultat temporaire, puis convertir le type de données BIGINT

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

Franchement, je ne vois rien de mal avec le code... c'est si simple...

[ Je suis l'aide de SQL 2008 ]

[MODIFIER]

Merci Nathan pour la lien.
Que de bonnes informations que je ne connaissais pas, mais je ne comprends toujours pas pourquoi j'obtiens l'erreur et pourquoi dois-je faire des "trucs" pour obtenir un simple script comme ce travail.

Est-ce quelque chose que je devrais savoir comment traiter comme un programmeur?

Ou, - ce un bug, et si oui, je vais réfléchir à cette question fermée.

Je suppose que vous avez raison. Pourquoi devrait-SQL déduire 7 est un type bigint plutôt qu'un int?
Il n'a même pas pense que c'est un int, il pense qu'il est numeric(1,0).
Nathan, vous avez raison. La question est de savoir pourquoi j'obtiens une erreur. Pourquoi n'est pas SQL attribuant le droit type de données quand est-il nécessaire?

OriginalL'auteur leoinfo | 2011-02-16