Konvertierung führte zum Überlauf einer int-Spalte

IchHH

Datenbank-Guru
Beiträge
282
Hallo ich versuche mittels

sum(RIGHT([BKV_1].[BKV_KT],18)/9) as Ergebniss

eine Zahl zu errechnen und bekomme dann den Fehler, wie er aus der Überschrift zu entnehmen ist.

Was aber machen ich falsch? Bzw. wie schaffe stelle ich das ab?
 
Werbung:
Deine Spalte [BKV_1].[BKV_KT] wird eine Zeichenkette sein und bei einem betroffenen Datensatz wird die Konvertierung in eine Zahl scheitern, vermutlich weil ein für Zahlen ungültiges Zeichen in der Zeichenkette steht.

Du kannst diese Datensätze entweder im WHERE-Teil komplett filtern oder per CASE vorher prüfen ob es sich um einen numerischen Wert handelt.
Code:
sum(CASE WHEN isnumeric(RIGHT([BKV_1].[BKV_KT],18)) = 1 THEN RIGHT([BKV_1].[BKV_KT],18)/9 ELSE 0 END) as Ergebniss
 
Hallo Ukulele,

guter Ansatz, leider hat der nicht funktioniert. Die Fehlermeldung ist die selbe.
Die Zahlen die dort rauskommen beim right sollten aber alle numerischer Art sein. Deshalb verwundert mich die Fehlermeldung sehr.

Interessanterweise sagt das System das es sich um ein Varchar handelt, selbst dann wenn ich es in einer anderen Tabelle importieren lasse.
 
Wenn du deine Zeichenkette durch 9 teilst versucht SQL die Zeichenkette in eine Zahl zu konvertieren, ich glaube Integer. Vielleicht ist deine bis zu 18-Stellen lange Zahl irgendwo zu groß? Du kannst ja mal deinen Select vereinfachen auf z.B. CONVERT(BIGINT,RIGHT([BKV_1].[BKV_KT],18)), kommt da die selbe Fehlermeldung? Bei Nachkommastellen muss eventuell auch FLOAT oder NUMERIC verwendet werden, du solltest auf jeden Fall explizit in das gewünschte Format konvertieren. Wenn das dann klappt kannst du teilen und summieren.
 
Ich habe eine Konvertierung in Numeric vorgenommen und anschließend die Daten mit ISNUMERIC geprüft. Nirgends ist eine 0 enthalten. Dennoch die selbe Fehlermeldung. So langsam weiß ich auch nicht mehr weiter.
 
Hm da hab ich auch grade keine Idee mehr. Sind Nachkommastellen enthalten? Hier gilt meist das US Format bei der Konvertierung mit . als Dezimalkennzeichen und , wird als Tausender-Trennzeichen interpretiert.
 
Werbung:
Zum Eingrenzen des Fehlers vielleicht mal die Zeile suchen, die Ärger bereitet.
Du hast doch bestimmt auf der Tabelle irgend einen Schlüssel.
Dann baust die Abfrage so um, dass du zuerst nur nach Sätzen in der unteren Hälfte der Tabelle suchst.
Also zum Bleistift
SELECT xyz WHERE KEYFIELD<='M' ; Falls der Schlüssel z.B. Strings wären
Trifft der Fehler immer noch auf, dann splittest du den Bereich wieder
SELECT xyz WHERE KEYFIELD<='MM'
Sonst
SELECT xyz WHERE KEYFIELD>'M' AND <='ZM'
Das wiederholst du solange, bis der Satz eindeutig identifiziert ist.
ist unter Umständen ein bisschen Arbeit, aber am Ende hat man den Kandidaten

Eine andere Möglichkeit ist, den SQL-Profile anzuwerfen und alle Zugriffe zu protokollieren.
Der letzte Zugriff auf die Datenbank sollte dann den Problem-Satz enthalten

Gruß Ingo
 
Zurück
Oben