1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Zeilenumbruch für xml

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von MaMeSu, 20 Mai 2020.

  1. MaMeSu

    MaMeSu Neuer Benutzer

    Hallo zusammen!

    Ich habe folgendes Problem:

    Ich möchte aus einer MSSQL Datenbank mittels Management Console einen Text aus einer Tabelle in eine xml Datei übergeben. Soweit ist das auch kein Problem. Die einzelne Textzeile der xml darf maximal 40 Zeichen lang sein. Dieses habe ich über substring und den Startpunkt gelöst. Auch das funktioniert soweit. Jetzt habe ich aber das Problem, dass halt genau nach den 40 Zeichen getrennt wird. Ich habe dadurch wilde Trennungen mitten im Wort, die unschön sind, wenn die Daten extern dargestellt werden sollen.
    Hat jemand einen Lösungsansatz für mich? Ich bin definitv Laie was das Thema SQL angeht, von daher bitte für Dummies ;)
     
  2. Tommi

    Tommi Datenbank-Guru

    Hallo MaMeSu

    Das Limit von 40 zeilen finde ich für XML etwas seltsam, wo kommt denn diese Limitierung her?
    Wenn das Voraussetzung zur Trennung eines XML-Tags ist, dann bleibt dir ja nichts anders übrig als irgendwann mitten im Wort zu trennen.
    Ansonsten musst du den Text Wort für Wort durchlaufen und die einzutragende Textlänge und die Länge des folgenden Wortes berücksichtigen.
    Da gibt es aber sinnvollere Möglichkeiten als die Lösung auf dem SQL Server!

    Geht aber natürlich auch auf dem SQL-Server:
    Code:
    DECLARE @txt varchar(max) = 'Ich möchte aus einer MSSQL Datenbank mittels Management Console einen Text aus einer Tabelle in eine xml Datei übergeben. Soweit ist das auch kein Problem. Die einzelne Textzeile der xml darf maximal 40 Zeichen lang sein. Dieses habe ich über substring und den Startpunkt gelöst. Auch das funktioniert soweit. Jetzt habe ich aber das Problem, dass halt genau nach den 40 Zeichen getrennt wird. Ich habe dadurch wilde Trennungen mitten im Wort, die unschön sind, wenn die Daten extern dargestellt werden sollen.
    Hat jemand einen Lösungsansatz für mich? Ich bin definitv Laie was das Thema SQL angeht, von daher bitte für Dummies'
    
    
    SELECT @txt, LEN(@txt)
    
    WHILE CHARINDEX('  ', @txt) > 0
    BEGIN
        SET @txt = REPLACE(@txt, '  ', ' ')
    END
    
    DECLARE @Wort varchar(255), @Ergebnis varchar(max) = '', @MaxLen int, @Zeile varchar(40) = ''
    SET @txt = LTRIM(RTRIM(@txt))
    SET @MaxLen = 40
    
    WHILE LEN(@txt) > 0 AND CHARINDEX(' ', RTRIM(LTRIM(@txt))) != 0
    BEGIN
        SET @Wort = LEFT(@txt, CHARINDEX(' ', @txt))
        print '<' + @Wort + '>'
    
        IF LEN(@Zeile) + LEN(@Wort) < @MaxLen
        BEGIN
            SET @Zeile += @Wort
            SET @txt = LTRIM(SUBSTRING(@txt, LEN(@Wort)+1, LEN(@txt)))
        END
        ELSE
        BEGIN
            SET @Ergebnis += '<row>' + @Zeile + '</row>'
            SET @Zeile = ''
        END
    
    END
    
    IF LEN(@txt) > 0
    BEGIN
        IF LEN(@txt) + LEN(@Zeile) <= @MaxLen
        BEGIN
            SET @Zeile += @txt
            SET @Ergebnis += '<row>' + @Zeile + '</row>'
        END
        ELSE
        BEGIN
            SET @Ergebnis += '<row>' + @txt + '</row>'
        END
    END
    
    SELECT CAST(@Ergebnis as xml)
    Viele Grüße,
    Tommi
     
    Walter gefällt das.
  3. MaMeSu

    MaMeSu Neuer Benutzer

    Vielen Dank für die schnelle Antwort!
    Die Vorgabe kommt von einem Stammdatenprotal, in dem ich mittels der xml die Daten hochladen muss/will. Die bieten mir 99 Zeilen a 40 Zeichen dafür an. Ist sehr unglücklich gelöst, wie ich finde, aber leider nicht zu ändern.
    Ich werde Deine Lösung testen!

    Vielen Dank und schon einmal ein schönes langes Wochenende!

    Gruß Matthias
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden