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.
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
Vous devez vous connecter pour publier un commentaire.
Lorsque vous êtes en train de faire des calculs de ce genre, les nombres sont stockés juste assez grand pour contenir un nombre, c'est à dire: numérique(1,0). Check this out:
http://msdn.microsoft.com/en-us/library/ms187745.aspx
Modifier
Ce n'est pas un bogue dans SQL Server. À partir de cette même page, il déclare:
et
Ce comportement défini. En tant que programmeur, si vous avez des raisons de croire que vos données vont déborder le type de données, vous devez prendre des précautions pour éviter cette situation. Dans ce cas, il suffit de la conversion de l'un de ces numéros pour un
BIGINT
permettra de résoudre le problème.N'oubliez pas que tout sur le côté droit de l' = est évalué en premier. C'est la partie qui est en train de jeter une erreur. Tout environnement de programmation serait de travailler de droite à gauche, juste certains pourraient automatiquement de promouvoir un autre type de données entier.
Et ce n'est pas la varaiable qui est un échec, c'est le calcul. Ne vous plaignez pas comment SQL Server ne prend ce genre de choses, la façon dont il est conçu de la façon dont il est conçu. Juste becasuee cela ne veut pas répondre à vos préjugés, ne signifie pas que la façon dont il est conçu, c'est non valide. Je suis sûr qu'ils avaient de bonnes raisons de faire les choses de cette façon. Vous avez besoin de vivre dans les limites de la base de données.
HLGEM, si personne ne "se plaindre" sur la façon dont les choses fonctionnent, il n'y aurait aucun besoin d'amélioration. Je pense que vous acceptez au moins que le message n'est pas vraiment clair. Vous pouvez voir ce message dans beaucoup de cas, ...
ce dont vous avez besoin à considérer est:
DECLARE @a AS VARCHAR(10); SET @a = 1+2+3;
doit cet ensemble@a
'123' ou '6', ce qui aurait pour résultat de@a = 1+(2+3)
? SQL rarement "le reste" pour rien, il s'essaie juste d'être cohérente dans la fonctionnalité.OriginalL'auteur Nathan DeWitt
Dans le premier exemple SQL Server multiplie une liste d'Entiers ensemble, et découvre le résultat est trop grand pour être un INT et l'erreur est générée. Dans le deuxième exemple, il constate qu'il y a un flotteur de sorte qu'il convertit tous les services de renseignements de flotteurs en premier et ensuite la multiplication.
De même, vous pouvez faire ceci:
Cela fonctionne bien car il avis il y a un BIGINT, de sorte qu'il convertit tous les services de renseignements de BIGINTs et la multiplication.
OriginalL'auteur Paul Spangle