Announcement

Collapse
No announcement yet.

SQL Server Bug?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Server Bug?

    Hallo zusammen,

    ich habe einen sehr interessanten Fehler entdeckt und ich weiß nicht ob es an mir liegt, oder ob es wirklich ein SQL Server Bug ist.

    Folgender Code
    Code:
    select	*
    from	(
    select	kind.dtrefnr kind,
    		kind.dtdtrefnr kindesmutter,
    		kind.dtcode kindescode,
    		convert(int, SUBSTRING(replace(kind.dtcode, '.', ''), 2, len(replace(kind.dtcode, '.', '')) -1)) kindesnummercode,
    		mutter.dtrefnr mutter,
    		mutter.dtdtrefnr muttermutter,
    		mutter.dtcode muttercode,
    		SUBSTRING(mutter.dtcode, 2, 2) mutternummercodevon,
    		convert(int, SUBSTRING(mutter.dtcode, 7, 2)) mutternummercodebis
    from	dtdiagnosetherapie kind
    join	dtdiagnosetherapie mutter
    on		kind.DTDTRefnr = mutter.DTRefnr
    where	kind.DTDTKRefnr = 52
    and		mutter.DTDTKRefnr = 52
    and		kind.DTCode not like '%..%'
    and		kind.DTCode != 'UUU'
    and		SUBSTRING(replace(kind.dtcode, '.', ''), 1, len(replace(kind.dtcode, '.', '')) -1) != SUBSTRING(replace(mutter.dtcode, '.', ''), 1, len(replace(mutter.dtcode, '.', '')))
    )a
    where	convert(int, mutternummercodevon) < 10
    meldet folgenden Fehler:
    Code:
    Meldung 245, Ebene 16, Status 1, Zeile 1
    Conversion failed when converting the varchar value 'UU' to data type int.
    Wenn ich aber folgendes ausführe, um diesen gewissen Eintrag zu finden:
    Code:
    select	*
    from	(
    select	kind.dtrefnr kind,
    		kind.dtdtrefnr kindesmutter,
    		kind.dtcode kindescode,
    		convert(int, SUBSTRING(replace(kind.dtcode, '.', ''), 2, len(replace(kind.dtcode, '.', '')) -1)) kindesnummercode,
    		mutter.dtrefnr mutter,
    		mutter.dtdtrefnr muttermutter,
    		mutter.dtcode muttercode,
    		SUBSTRING(mutter.dtcode, 2, 2) mutternummercodevon,
    		convert(int, SUBSTRING(mutter.dtcode, 7, 2)) mutternummercodebis
    from	dtdiagnosetherapie kind
    join	dtdiagnosetherapie mutter
    on		kind.DTDTRefnr = mutter.DTRefnr
    where	kind.DTDTKRefnr = 52
    and		mutter.DTDTKRefnr = 52
    and		kind.DTCode not like '%..%'
    and		kind.DTCode != 'UUU'
    and		SUBSTRING(replace(kind.dtcode, '.', ''), 1, len(replace(kind.dtcode, '.', '')) -1) != SUBSTRING(replace(mutter.dtcode, '.', ''), 1, len(replace(mutter.dtcode, '.', '')))
    )a
    where	mutternummercodevon like '%UU%'
    findet er keinen Eintrag?!?!?!

    Habe ich hier einen Denkfehler oder ist es ein SQL Server Fehler?

    Ich benutze SQL Server 2012 Standard

    GG Daman

  • #2
    Ach ja, zur Info: Es liegt an dieser mutternummercodevon. Wenn ich die oberen converts kommentiere, dann ist es genau der selbe Fehler.

    Es kommt mir so vor, als könnte er die SUBSTRING-Werte nicht richtig temporär speichern.

    Comment


    • #3
      Es kommt mir so vor, als könnte er die SUBSTRING-Werte nicht richtig temporär speichern.
      Du solltest nicht annehmen das die converts in deinem Subselect a zwingend vor dem in der where Klausel der äußeren Abfrage stattfinden. Der Optimizer kann das so intelligent (oder auch nicht) umgeformt haben das die mal vor oder nachher stattfinden.
      Insofern könnte ich mir auch vorstellen das einer der beiden converts für mutternummercodebis bzw. kindesnummercode scheitert weil die vor dem für mutternummercodevon stattfinden. Aber sobald du im äußeren SQL auf den Test per like umstellst der Optimizer es für besser hält den zuerst auszuführen und über die beiden problematischen converts dann nicht mehr stolpert weil die entsprechenden Datensätze schon raus sind. Letztlich siehst du aber die genaue Reihenfolge nur wenn du den ExplainPlan der Anweisung studierst.

      Comment


      • #4
        Originally posted by Daman View Post
        meldet folgenden Fehler:
        Code:
        Meldung 245, Ebene 16, Status 1, Zeile 1
        Conversion failed when converting the varchar value 'UU' to data type int.
        Das ist doch ne schöne, exakte Fehlermeldung (erstmal)
        Was Deine Prüfung angeht, wie istn das mit mssql und %ausdruck%, steht % auch für kein Zeichen?
        Ein where mutt..='UU' sollte es da doch auch tun oder?
        Gruß, defo

        Comment

        Working...
        X