Announcement

Collapse
No announcement yet.

Probleme mit UPDATE, RIGHT und Minuswerten

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

  • Probleme mit UPDATE, RIGHT und Minuswerten

    Hallo zusammen,

    der SQL Server 2008 zickt bei folgendem SELECT herum

    SELECT CASE WHEN LEN('') > 4 THEN
    CASE WHEN LEFT('',5) = '+4949' THEN '0' + RIGHT('',LEN('')-5)
    ELSE
    CASE WHEN LEFT('',4) = '4949' THEN '0' + RIGHT('',LEN('')-4)
    ELSE
    CASE WHEN LEFT('',3) = '+49' THEN '0' + RIGHT('',LEN('')-3)
    ELSE
    CASE WHEN LEFT('',2) = '49' THEN '0' + RIGHT('',LEN('')-2)
    ELSE ''
    END
    END
    END
    END
    ELSE ''
    END
    Fehlermeldung: Meldung 536, Ebene 16, Status 1, Zeile 1
    Invalid length parameter passed to the right function.

    Auf dem SQL Server 2000 läuft es korrekt.

    Man kann das Problem umgehen, wenn man eine temporäre Variable verwendet
    DECLARE @laenge AS integer;
    BEGIN
    IF LEN('') > 4
    BEGIN
    IF LEFT('',5) = '+4949'
    BEGIN
    SET @laenge = 5;
    SELECT '0' + RIGHT('',LEN('')-@laenge);
    END
    ELSE IF LEFT('',4) = '4949'
    BEGIN
    SET @laenge = 4;
    SELECT '0' + RIGHT('',LEN('')-@laenge);
    END
    ELSE IF LEFT('',3) = '+49'
    BEGIN
    SET @laenge = 3;
    SELECT '0' + RIGHT('',LEN('')-@laenge);
    END
    ELSE IF LEFT('',2) = '49'
    BEGIN
    SET @laenge = 2;
    SELECT '0' + RIGHT('',LEN('')-@laenge);
    END
    ELSE
    BEGIN
    SELECT ''
    END
    END
    ELSE
    BEGIN
    SELECT ''
    END
    END
    Das Problem ist nur, dass ich diesen Kram in einem UPDATE (SET numer = ....) benötige, und da laufen DECLARE und BEGIN nicht drin.

    Wie kriege ich das DECLARE und SET der Variable nun aber in ein UPDATE rein?

    Und warum versucht der SQL Server 2008 einen Befehl auszuführen, obwohl er wegen CASE WHEN LEN('') > 4 gar nicht in den Ereigniszweig gehen dürfte?

    Hat jemand einen Tipp?

    Danke und Gruß
    Volker

  • #2
    keine Ahnung, was ein LEN('') - 2 für einen Sinn hat, das Ergebnis ist allerdings negativ und RIGHT mag keinen negativen Wert für die Länge.

    bye,
    Helmut

    Comment


    • #3
      Normalerweise steht natürlich auch ein Text im Hochkomma.
      Dann funktioniert alles problemlos.
      Allerdings gibt es auch leere Inhalte und dann knallt es, obwohl ich das mit "SELECT CASE WHEN LEN('') > 4 THEN" abfange.
      Ist mir ein Rätsel, warum der SQL Server einen Befehl bemängelt, wenn doch gar nicht der entsprechende Ereigniszweig aufgerufen wird.

      Es geht bei dem Ganzen darum, fehlerhafte Telefonnummern zu korrigieren.

      Comment


      • #4
        Tut er auch nicht. Probiere mal:

        select case when len('') > 4 then 'A' else 'B' end

        ... und du wirst sehen, es kommt 'B' als Ergebnis. Der SQL-Server arbeitet da richtig. Ich würde eher sagen, du hast da in der Variablen etwas anderes drinnen stehen (denn LEN('') macht ja nicht wirklich Sinn) oder es ist sonstwas falsch im CASE, aber am SQL-Server bzw. der Version liegt es garantiert nicht.

        bye,
        Helmut

        Comment


        • #5
          Das liegst Du leider falsch, sonst dürfte ja das zweite Beispiel auch nicht funktionieren.

          Aber egal, ich brauche keine Hinweise, was angeblich nicht geht, sondern eine Lösung für mein Problem. Es muss doch möglich sein, leere Inhalte abzufangen.

          Nochmal: Das erste Beispiel funktioniert fehlerfrei im SQL Server 2000.

          Wenn Du Dein Beispiel änderst:

          select case when len('') > 4 then '0' + RIGHT('', LEN('') - 5) else 'B' end

          Kommt eben nicht B heraus, sondern die bekannte Fehlermeldung. Und das darf eigentlich nicht sein.
          Zuletzt editiert von Bazonga; 20.01.2011, 09:40.

          Comment


          • #6
            Ich habe es nun hingekriegt.
            Zuerst die Funktion erstellen
            CREATE FUNCTION telefon (@telefon varchar(50)) RETURNS varchar(50)
            WITH EXECUTE AS CALLER
            AS
            BEGIN
            DECLARE @laenge AS integer;
            IF LEN(@telefon) > 4
            BEGIN
            IF LEFT(@telefon,5) = '+4949'
            BEGIN
            SET @laenge = 5;
            RETURN '0' + RIGHT(@telefon,LEN(@telefon)-@laenge);
            END
            ELSE IF LEFT(@telefon,4) = '4949'
            BEGIN
            SET @laenge = 4;
            RETURN '0' + RIGHT(@telefon,LEN(@telefon)-@laenge);
            END
            ELSE IF LEFT(@telefon,3) = '+49'
            BEGIN
            SET @laenge = 3;
            RETURN '0' + RIGHT(@telefon,LEN(@telefon)-@laenge);
            END
            ELSE IF LEFT(@telefon,2) = '49'
            BEGIN
            SET @laenge = 2;
            RETURN '0' + RIGHT(@telefon,LEN(@telefon)-@laenge);
            END
            END
            ELSE
            BEGIN
            RETURN @telefon;
            END
            RETURN @telefon;
            END
            ;
            Dann das Update
            UPDATE tabelle SET telefonnummer = dbo.telefon('');
            Und dann die Funktion wieder entfernen
            DROP FUNCTION telefon;
            Ziemlich umständlich das Ganze :-(

            Comment


            • #7
              Wenn Du Dein Beispiel änderst:

              select case when len('') > 4 then '0' + RIGHT('', LEN('') - 5) else 'B' end

              Kommt eben nicht B heraus, sondern die bekannte Fehlermeldung. Und das darf eigentlich nicht sein.
              Falls du Visual Studio verwendest: im Source definierst du eine Variable x = 0 und dann probierst du einmal

              int x = 0;
              if ( 7 < 1) x = 7 / x;

              und einmal
              if ( 7 < 1) x = 7 / 0;


              Während die erste Definition anstandslos geht, wirst du bei der zweiten Variante eine Fehlermeldung bezüglich Division mit 0 kriegen, obwohl aufgrund der IF-Bedingung die Division sicher nie ausgeführt wird. Und bei deinem SQL-Statement ist das genauso, nur dass das der SQL-Server 2000 damals vielleicht noch nicht bemängelt hat. Richtig war es aber damals schon nicht und wird es heute auch nicht.

              bye,
              Helmut

              Comment

              Working...
              X