Announcement

Collapse
No announcement yet.

Konvertierungsfehler beim View

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

  • Konvertierungsfehler beim View

    Hallo SQL-Experten,<BR><BR>ich bin wirklich dem Verzweifeln nahe, hier also das Problem:<BR>In einer Tabelle sind in einer Spalte Werte abgelegt, die eigentlich verschiedenen Typen angehören. Leider habe ich noch keinen SQL-Server 2000, der den Typ Variant unterstützt. Ich helfe mir also dadurch, dass ich die Werte in VarChar konvertiere, so mit der eigentlichen Typangabe ablege und mir dann ein View bastel, für die Rückkonvertierung. Soweit so gut. Möchte ich jetzt aber filtern, dann gibt es einen Konvertierungsfehler - warum?<BR>Ich gebe zu, das war alles ein wenig unverständlich. Hier ein Beispiel, damit jeder das nachvollziehen kann:,<BR><BR>
    create table a (a int, b varchar(1)) --Eine Tabelle<BR>
    insert into a values(1,'1')<BR>
    insert into a values(2,'A')<BR>
    insert into a values(1,'2')<BR>
    <BR><BR>
    create table b (a int, b varchar(1)) --noch eine Tabelle zur Typunterscheidung<BR>
    insert into b values(1,'X')<BR>
    insert into b values(2,'Y')<BR>
    <BR><BR>
    create view va as --beide Tabellen zu einem View verschmelzen<BR>
    select b.b as typ, a.b as wert<BR>
    from a<BR>
    inner join b on b.a = a.a<BR>
    <BR><BR>
    create view va2 --Alle X'n sind int -> also cast...<BR>
    as<BR>
    select cast(wert as int) as wert from va where typ = 'X'<BR>
    <BR><BR>
    select wert from va2 --funktioniert !!!<BR>
    select wert from va2 where wert = 1 --Fehlermeldung !!!<BR><BR>
    Wie kann ich dieses Problem lösen - direkt oder durch die Brust ins Auge?<BR>Schon jetzt vielen Dank für die Mühe!!!<BR><BR>Olle

  • #2
    Hallo,
    <br>
    <br>anscheinend optimiert der SQL Server die SQL Statements derart, das er va und va2 und das eigentliche Select auf einmal aufruft. Ich würde aber auch nicht mit einem Integer über ein geCastetes VarChar Feld filtern.
    <br>Wie folgt funktioniert es:
    <br>
    <br>create view va2 --Alle X'n sind int -> also cast...
    <br>as
    <br>select wert from va where typ = 'X'
    <br>
    <br>select wert from va2 where wert = '1' --OK!!!
    <br>
    <br>und zur Not, wenn man nicht auf den Int in der Where Klausel verzichten mag dann:
    <br>select wert from va2 where wert = Cast(1 as varchar)
    <br>
    <br>Aber vieleicht hat ja noch wer eine andere Idee.
    <br>
    <br>mfg
    <br>p

    Comment


    • #3
      Hallo,

      der Grund für das o.g. Problem liegt in der Reihenfolge, die vom SQL-Standard für die Auswertung der SELECT-Anweisung vorgeschrieben wird:

      Schritt 3: SELECT <br>
      Schritt 1: FROM <br>
      Schritt 2: WHERE<br>
      Schritt 4: ORDER BY

      Bei der Anweisung <i>select wert from va2 where wert = 1 </i> wird der WHERE-Vergleich (Schritt 2) <b>vor</b> dem CAST (Schritt 3) ausgeführt, daher ist das Veto des SQL-Servers verständlich

      Comment


      • #4
        Hallo,<BR><BR>
        Vielen Dank für die Hilfe. Ich werde dann wohl den Weg über temporäre Tabellen gehen. Damit löst sich das Problem.<BR><BR>MfG<BR>Oll

        Comment

        Working...
        X