TSQL-Arithmetischer überlauf mit BIGINT
Kann jemand klären für mich, warum erhalte ich eine Fehlermeldung, wenn ich versuche die variable @a in dem Beispiel unten?
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.
*/
Was ich herausfinden konnte bis jetzt, ist, dass, intern, SQL beginnt dabei die mathematische Auswertung der Multiplikation und der Platzierung der temporären Ergebnis in ein INT, dann wirft er es zu einem BIGINT.
Jedoch, wenn ich einen 1.0 * zu meiner Liste von zahlen, es gibt keine Fehler, von daher glaube ich, dass für diese Zeit-SQL verwendet schweben wie ein temporäres Ergebnis, dann warf Sie es auf BIGINT
DECLARE @b BIGINT
SET @b = 1.0 * 7*11*13*17*19*23*29*31
/*
NO ERROR
*/
Ehrlich gesagt, ich sehe nicht, nichts falsch mit dem code... es ist so einfach...
[ Ich bin mit SQL 2008 ]
[BEARBEITEN]
Nathan Dank für die link.
Das ist gute Informationen, die ich nicht kannte, aber ich verstehe immer noch nicht warum erhalte ich die Fehlermeldung und warum muss ich das tun "tricks", um ein einfaches Skript, wie diese arbeitet.
Ist es etwas, dass ich wissen sollte, wie man mit als Programmierer?
Oder das ein bug und wenn ja, ich betrachte diese Frage geschlossen.
- Ich würde davon ausgehen, Sie sind richtig. Warum sollte SQL ableiten 7 ist eine bigint anstatt int?
- Es schadet auch nicht, denke, es ist ein int, es denkt, es ist
numeric(1,0)
. - Nathan, du hast Recht. Die Frage ist, warum bekomme ich eine Fehlermeldung. Warum nicht SQL-Zuordnung der richtigen Daten geben Sie, wenn benötigt???
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn man Berechnungen wie diese, die einzelnen Nummern gespeichert sind, nur groß genug zu halten, dass der Zahl, dh: numeric(1,0). Check this out:
http://msdn.microsoft.com/en-us/library/ms187745.aspx
Bearbeiten
Dies ist nicht ein Fehler in SQL Server. Von derselben Seite heißt es:
und
Dieser ist definiert Verhalten. Als Programmierer, wenn Sie Grund zu der Annahme haben, dass Ihre Daten überlauf der Daten geben, die Sie brauchen, um Vorkehrungen zu treffen, um diese situation vermeiden. In diesem Fall einfach die Umwandlung eines jener zahlen zu einem
BIGINT
wird das problem lösen.DECLARE @a AS VARCHAR(10); SET @a = 1+2+3;
sollte dieser Satz@a
zu '123' oder '6', was zur Folge hätte@a = 1+(2+3)
? SQL-selten wird 'den rest' für alles, was, die es hauptsächlich nur versucht, konsequent zu sein in der Funktionalität.Im ersten Beispiel SQL Server multipliziert eine Liste mit Int-Werten zusammen, und entdeckt, das Ergebnis ist zu groß für ein INT, und der Fehler wird generiert. Im zweiten Beispiel, es sieht, es ist ein float, so dass es konvertiert alle INTs zu schwimmt und erst dann macht der Multiplikation.
Ähnlich, können Sie dies tun:
Dies funktioniert gut, weil es sieht, dass Sie ein BIGINT, so dass es konvertiert alle INTs in BIGINTs und führt dann die Multiplikation.