none
Convert nvarchar to int RRS feed

  • Frage

  • Hallo Zusammen,

    ich versuche einen Wert nvarchar in einen int umzuwandeln.

    select menge
    ,Produkt
    ,left(Produkt,1) as GrpCode
    ,convert (int (1), (left(Produkt,1)))  as PrdGrpCode
    from Verk_Direkt
    where YEAR (Buchungsdatum) =2014 
    and left(Produkt,1) =1

    Dem System gefällt der Teil bei Convert nicht.

    Wie macht man das richtig?

    Danke für die Hilfe

    Snoopy

    Dienstag, 22. August 2017 13:24

Antworten

Alle Antworten


  • ,convert (int (1), (left(Produkt,1

    Hallo,

    Im SQL Server kannst Du bei dem Datentypen int keine Art Präzision/Auflösung angeben wie Du es mit int(1) gemacht hast; das geht nur in anderen RDBMS; einfach mal (1) entfernen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Dienstag, 22. August 2017 13:57
  • Wobei auch

    and left(Produkt,1) =1

    nicht unbedingt typsicher ist. Der SQL-Server macht hier einen Autocast und stirbt, wenn der Inhalt in Stelle 1 mal nicht numerisch ist.
    Dasselbe gilt i.Ü. auch für den Convert, der ggf. mit IsNumeric() ergänzt werden sollte.
    Wenn du sicher bist, dass in jedem Datensatz ein Zahl vorne steht, ist das OK.

    Für die Performance der Abfrage ist ggf. ein Index erforderlich.


    Dienstag, 22. August 2017 16:20
  • Guten Morgen und 

    herzlichen Dank für die Antworten

    Kann denn das mit einer unterabfrage gelöst werden, dass nur Datensätze erscheinen die auch wirklich eine Nummer am Anfang haben?

    SELECT Produkt
    FROM        [dbo].[Verk_Direkt]
    where Produkt <> 'Text.'

    Nun meint aber das System, dass die Unterabfrage  mehr als einen Datensatz zurück liefert.

    Wie löse ich dieses Problem?

    Gruss

    Snoopy

    Mittwoch, 23. August 2017 06:18
  • Mit

    and left(Produkt,1) ='1'

    bist du schon auf der sicheren Seite, da kein Autocast anfällt.
    Ggf. kann der SQL-Server einen Index über Produkt verwenden, wenn du statt dessen

    Produkt like '1%'

    verwendest, das hängt aber vom Optimizer ab.

    Einzig der Convert ist hier noch zu ergänzen:

    convert(int, case left(produkt, 1) when '1' then left(produkt, 1) else NULL end)

    Der Hintergrund ist hier, dass ein Select-Ausdruck u.U. vom Optimizer noch vor der Where-Klausel ausgewertet werden kann und somit ein Fehler produziert wird.

    Mittwoch, 23. August 2017 07:27