none
Fehler bei Konvertierung in den int-Datentyp RRS feed

  • Frage

  • Hallo zusammen,

    ich stehe vor einem Rätsel. In einer Query lasse ich per convert(int;RE) den Text in eine Nummer umwandeln. Die Textwerte sind in der Form 0004567 vorhanden, oder auch als 0 Werte, bzw. leer.

    Ich bekomme allerdings bei rund 230.000 Datensätzen rund 5 Fehlermeldungen mit folgendem Inhalt:

    "Fehler bei der SQL Ausführung: ......
    Fehlerquelle: .Net SQL Client DataProvider
    Fehlermeldung: Fehler beim Konvertieren des nvarchar Wertes
    '..........' in den int-Datentyp"

    Diesen Wert "........" kann ich jedoch in der Quellspalte nicht finden! Hat jemand von Euch eine Lösung dafür?

    Vielen Dank!

    Gruß Jürgen

    Sonntag, 12. Mai 2013 06:14

Antworten

  • Hallo,

    ok, SQL 2012 ist fein, denn da gibt es die neuen Funktionen wie TRY_CONVERT, mit dessen Hilfe Du den Problemfällen auf die Spur kommen solltest.

    SELECT *
    FROM Tabelle
    WHERE TRY_CONVERT(int, RE) IS NULL

    Das sollte Dir alle Datensätze liefern, die nicht konvertiert werden können.

    Olaf Helper

    Blog Xing

    • Als Antwort markiert juergen_ks Sonntag, 12. Mai 2013 07:24
    Sonntag, 12. Mai 2013 06:58

Alle Antworten

  • Hallo Jürgen,

    bevor es Missverständnisse gibt, der Fehler tritt in einem SSIS Package auf (wegen .Net SQL Client DataProvider als Fehlerquelle)? Lass Dir doch mal die fehlerhaften Zeilen über die Fehlerausgabe in eine Textdatei umleiten, dann kannst Du Dir die Daten ansehen, wo die Konvertierung fehlgeschlagen ist.


    Olaf Helper

    Blog Xing

    Sonntag, 12. Mai 2013 06:38
  • Hallo Olaf,

    nein, in keinem SSIS Package. Diese Version nutze ich nicht mehr, im Einsatz habe ich jetzt die SQL Server 2012 Express Version. Der Fehler tritt im Abfragedesigner auf.

    Gruß, Jürgen

    Sonntag, 12. Mai 2013 06:51
  • Hallo,

    ok, SQL 2012 ist fein, denn da gibt es die neuen Funktionen wie TRY_CONVERT, mit dessen Hilfe Du den Problemfällen auf die Spur kommen solltest.

    SELECT *
    FROM Tabelle
    WHERE TRY_CONVERT(int, RE) IS NULL

    Das sollte Dir alle Datensätze liefern, die nicht konvertiert werden können.

    Olaf Helper

    Blog Xing

    • Als Antwort markiert juergen_ks Sonntag, 12. Mai 2013 07:24
    Sonntag, 12. Mai 2013 06:58
  • Hallo Olaf,

    das ist eine interessante Funktion. Ja, es wurden Datensätze mit dem Wert NULL zurückgeliefert. Wenn ich übrigens bei der Konvertierung nicht INT sondern FLOAT verwende, erhalte ich keinen Fehler. Wäre das dann auch letztendlich eine Lösung...? Bin mir nicht sicher.

    Gruß, Jürgen

    Sonntag, 12. Mai 2013 07:07
  • Hallo Jürgen,

    dann lasse Dir die "fehlerhaften" Datenzeilen mal ausgeben.

    Um sicherzugehen, dass es sich bei der Spalte, um eine eine Zahlenangabe handelt -
    nicht das es der Punkt ein Trenner ist (z. B. "1234.1") - und die Spalte doch alphanumerisch ist.
    Oder aber eine 1000er Gruppierung - dann müsste man die erst via REPLACE entfernen.

    Gruß Elmar

    Sonntag, 12. Mai 2013 07:22
  • Besten Dank!
    Sonntag, 12. Mai 2013 07:24
  • Was für Werte sind es denn, die nicht konvertiert warden konnte bzw. weshalb können sie nicht in INT konvertiert werden?

    Sind es Fließpunktzahlen und sollen die auch so übernommen werden? Oder doch als INT? Eine implizite Konvertierung Float as String => Integer geht nicht, aber eine explizite Text => Float => Int:

    SELECT CONVERT(int, CONVERT(float, '12.3456'))

    Oder sind die Zahlen für Int zu groß? Dann könntest Du auch BigInt als Datentypen verwenden.


    Olaf Helper

    Blog Xing

    Sonntag, 12. Mai 2013 07:24
  • Hallo Elmar,

    es sind alles Zahlenwerte, kein Dezimalpunkt oder ähnliches zu erkennen. Ich konvertiere jetzt mit FLOAT und hoffe, das ich bei der Abfrage mit INT Werten später keine Probleme bekomme. Dann würde ich den NULL Wert in eine "echte" 0 umwandeln.

    Vielen Dank!

    Schönen Gruß,

    Jürgen

    Sonntag, 12. Mai 2013 07:26
  • Dann liegt es wahrscheinlich eben an der Größe der Zahlen => BigInt.

    SELECT *
    FROM Tabelle
    WHERE TRY_CONVERT(bigint, RE) IS NULL
    Wenn es zutrifft, solltest Du mit der Abfrage kein Ergebnis mehr bekommen.

    Olaf Helper

    Blog Xing

    Sonntag, 12. Mai 2013 07:31
  • Die fehlerhaften Werte sind NULL "Werte". Weshalb diese mit FLOAT, bzw. Deiner genannten verschachtelten Lösung nun auch als INT bzw. echte "0" akzeptiert werden, kann ich nicht nachvollziehen.

    Nun funktioniert es und das ist das Wichtigste für mich - VIELEN DANK!

    Gruß, Jürgen

    Sonntag, 12. Mai 2013 08:00