Announcement

Collapse
No announcement yet.

Zeichenketten mittel while-Schleife

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

  • Zeichenketten mittel while-Schleife

    Hallo Zusammen,

    ich will mittels eine FunKtion aus einer Zeichenkette alle Sonderzeichen herausfiltern. Dazu folgender Code:

    [COLOR="#0000ff"][COLOR="Blue"]ALTER FUNCTION [dbo].[ArtSuchStr](@ArtBez char(50))

    RETURNS char(50)

    AS
    BEGIN
    declare @x int
    declare @Zchn int
    declare @HlpStr char(30)

    set @x = 1
    while @x <=Len(@ArtBez)
    begin
    set @Zchn = ascii(substring(@ArtBez, @x, 1))
    If (@Zchn >= 48 And @Zchn <= 57) Or (@Zchn >= 65 And @Zchn <= 90) Or (@Zchn >= 97 And @Zchn <= 122)
    begin
    set @HlpStr = @Hlpstr+(substring(@ArtBez, @x, 1))
    End
    set @x= @x+1
    end

    Return @hlpstr
    END

    Die markierte Zeile funktioniert nicht (leere Spalte). Wenn ich aber den Teil "@Hlpstr+" aus der Zeile entferne liefert mir die Funktion zumindestens das letzte Zeichen der Ursprungskette.
    Was mach ich hier blos falsch?

    Danke für Eure Hilfe

    mpeit

  • #2
    varchar benutzen anstatt chars
    [HIGHLIGHT="SQL"]BEGIN TRAN;
    GO
    ALTER FUNCTION [dbo].[ArtSuchStr]
    (@ArtBez VARchar(50))
    RETURNS VARchar(50) AS
    BEGIN;
    declare @x int;
    declare @Zchn int;
    declare @HlpStr VARchar(50);
    SET @HlpStr = SPACE(0);
    set @x = 1;
    while @x <= Len(@ArtBez)
    begin;
    set @Zchn = ascii(substring(@ArtBez, @x, 1));
    If (@Zchn >= 48 And @Zchn <= 57) Or (@Zchn >= 65 And @Zchn <= 90) Or (@Zchn >= 97 And @Zchn <= 122)
    set @HlpStr = @Hlpstr + NCHAR(@Zchn);
    set @x= @x+1;
    end;
    Return @hlpstr;
    END;
    GO
    SELECT [dbo].[ArtSuchStr] ('Test1+-#Test2') AS Test ;
    ROLLBACK;
    [/HIGHLIGHT]
    [HIGHLIGHT=Ergebnis]Test
    --------------------------------------------------
    Test1Test2[/HIGHLIGHT]

    PS: Formatierung von SQL in Beiträgen

    Comment


    • #3
      Hallo mpeit,

      den Teil "@Hlpstr+" aus der Zeile entferne
      wichtig ist, das Du @HlpStr auch initialisierst, sonst ist sie NULL und NULL + irgendwas ergibt immer NULL; deswegen bekamst Du ein Ergebnis, als du es weg gelassen hattest.
      ebis hat es in seinem Script mit

      SET @HlpStr = SPACE(0);

      gemacht, alternative:
      SET @HlpStr = "";
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #4
        Originally posted by O. Helper View Post
        Hallo mpeit,


        wichtig ist, das Du @HlpStr auch initialisierst, sonst ist sie NULL und NULL + irgendwas ergibt immer NULL; deswegen bekamst Du ein Ergebnis, als du es weg gelassen hattest.
        ebis hat es in seinem Script mit

        SET @HlpStr = SPACE(0);

        gemacht, alternative:
        SET @HlpStr = "";
        die CHAR's durch VARCHAR's ersetzt werden, denn[Highlight="SQL"]BEGIN TRAN;
        GO
        CREATE FUNCTION [dbo].[ArtSuchStr] (@ArtBez char(50))
        RETURNS char(50) AS
        BEGIN;
        declare @x int;
        declare @Zchn int;
        declare @HlpStr char(50);
        SET @HlpStr = SPACE(0);
        SET @x = 1;
        while @x <= Len(@ArtBez)
        begin;
        SET @Zchn = ascii(substring(@ArtBez, @x, 1));
        IF (@Zchn >= 48 AND @Zchn <= 57) OR (@Zchn >= 65 AND @Zchn <= 90) OR (@Zchn >= 97 AND @Zchn <= 122)
        SET @HlpStr = @Hlpstr + CHAR(@Zchn);
        SET @x= @x+1;
        end;
        RETURN @hlpstr;
        END;
        GO
        SELECT 'Test1+-#Test2' AS Text, [dbo].[ArtSuchStr] ('Test1+-#Test2') AS ArtSuchStr ; ROLLBACK;[/Highlight]
        liefert trotz Initialisierung mit Space(0) eben diesen:
        [HighLight="Result"]Text ArtSuchStr
        ------------- --------------------------------------------------
        Test1+-#Test2
        [/Highlight]

        Comment


        • #5
          Hallo ebis,
          natürlich hast Du recht, aber ohne Initialisierung kommt so oder so nichts bei raus:
          [highlight=SQL]SET NOCOUNT ON;
          DECLARE @chars char(10);
          DECLARE @vars varchar(10);

          SET @chars = @chars + 'Test'
          SET @vars = @vars + 'Test'

          SELECT @chars
          SELECT @vars

          SET @chars = SPACE(0);
          SET @vars = '';

          SET @chars = @chars + 'Test'
          SET @vars = @vars + 'Test'

          SELECT @chars
          SELECT @vars[/highlight]
          [highlight=code]----------
          NULL

          ----------
          NULL

          ----------


          ----------
          Test[/highlight]
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Hallo zusammen,

            Hat funktioniert!!
            1000x Danke

            gruß
            mpeit

            Comment


            • #7
              Originally posted by O. Helper View Post
              Hallo ebis,
              natürlich hast Du recht, aber ohne Initialisierung kommt so oder so nichts bei raus:
              Hi Olaf,
              ja ja, aber das ist ja trivial...
              das mit den char's und varchar's hat mich mehr gewundert...
              (kommt wohl davon das ich in 99,9% der Fälle mit varchars arbeite...)

              Comment

              Working...
              X