Teil(e) eines Strings in einem mit TAB & CRLF getrennten Feld extrahieren

Poste mal bitte 2 echte Datensätze die, wenn du das Script für diese beiden Datensätze laufen läßt, eine Fehlermeldung verursachen.
 
Werbung:
Ich habe die Tabelle nochmals als beas_stll in die DB kopiert und alle Datensätze außer einem gelöscht. Dann habe ich die Abfrage laufen lassen. ohne die Option "option (maxrecursion 0)" gibt es den Fehler mit Rekursion mit der Option eine endlos Schleife.

Hier das Ergebnis kopiert und einmal als Screenshot

105190 0.010000 105155 0.010000

upload_2018-9-28_14-2-19.png
 
Sry aber mit nem Screenshot kann ich wenig anfangen, ich brauche 2 echte Ausgangsdatensätze um selbst den Code darauf anwenden zu können.
 
Hi, da hab ich wohl was falsch verstanden ;-)

In welcher form möchtest Du die Daten haben? Ich habe keine Ahnung wie ich Dir die Rohdaten mit allen Steuerzeichen zukommen lassen soll.
 
Einfach hier rein kopieren, wie gesagt ich brauche nur 2 Datensätze und nur die Spalte, die zerlegt werden soll. Wie viele Zeichen sind das denn?
 
Das hatte ich ja schon mal reinkopiert (siehe oben - wo ich auch den Screenshot eingefügt hatte), aber da sind ja die Steuerzeichen nicht enthalten - das ist ja das Ergebnis aus dem SQL Query Analyser mit obiger Abfrage:

105190 0.010000 105155 0.010000
 
Hm vermutlich sind genau die das Problem aber ich hab anders keine Idee warum es nicht funktioniert. Dann müsstest du die tatsächlich als Textdatei irgendwo hoch laden und den Link posten.
 
Hi, ich habe mal das ganze über eine Export-Abfrage in eien Text-Datei exportiert. Ich habe Semikolon als Zeilentrennzeichen verwendet. Aber wenn Du es mit einem Texteditor öffnest werden die Zeilen durch die im Text vorhandenen CR+LF dargestellt. Das bedeutet, wenn ein Semikolon am Anfang einer Zeile steht, dieser zur vorhergehenden Zeile gehört und nach dem Semikolon die neue Zeile beginnt ;-)

Ich habe keine Ahnung wie man als DB Designer auf so eine sinnlose Datenspeicherung kommt, aber leider muss ich damit leben.
 

Anhänge

  • alternativmaterial.txt
    15,7 KB · Aufrufe: 7
Verrückte Sache, wenn ich Testdaten aus dem Editor in das Management Studio kopiere geht es. Wenn ich die Textdatei per BULK IMPORT in eine Tabelle schiebe kommt es zu dem von dir beschriebenen Problem weil die right()-Funktion den String überhaupt nicht kürzt. Sie sollte eigentlich den Teil hinter dem ersten Zeilenumbruch als "Rest" ausweisen, gibt aber den ganzen String zurück. Dadurch wird der String nie kürzer und die Endlosschleife beginnt.

Ich habe keine Erklärung gefunden warum right() nicht arbeitet, hatte ich noch nie. Jetzt nutze ich substring() und es tut was es soll. Hier nochmal der ganze Testcode:
Code:
--Tabelle und Daten importieren
DROP TABLE idiocrazy;
CREATE TABLE idiocrazy(alternativmaterial NVARCHAR(MAX));

BULK INSERT idiocrazy
   FROM 'd:\alternativmaterial.txt'
   WITH
      (
         ROWTERMINATOR =';'
      );

ALTER TABLE idiocrazy ADD itemcode UNIQUEIDENTIFIER;
UPDATE idiocrazy SET itemcode = newid();

--CTE
WITH temp(itemcode,subitem,alternativmaterial,rest) AS (
   SELECT   itemcode,
           1,
           (   CASE
               WHEN   alternativmaterial LIKE '%' + CHAR(13) + CHAR(10) + '[0-9]%'
               THEN   left(alternativmaterial,patindex('%' + CHAR(13) + CHAR(10) + '[0-9]%',alternativmaterial)+1)
               ELSE   alternativmaterial
               END ),
           (   CASE
               WHEN   alternativmaterial LIKE '%' + CHAR(13) + CHAR(10) + '[0-9]%'
               THEN   substring(alternativmaterial,patindex('%' + CHAR(13) + CHAR(10) + '[0-9]%',alternativmaterial)+2,datalength(alternativmaterial))
               ELSE   NULL
               END )
   FROM   idiocrazy
   UNION ALL
   SELECT   itemcode,
           subitem + 1,
           (   CASE
               WHEN   rest LIKE '%' + CHAR(13) + CHAR(10) + '[0-9]%'
               THEN   left(rest,patindex('%' + CHAR(13) + CHAR(10) + '[0-9]%',rest)+1)
               ELSE   rest
               END ),
           (   CASE
               WHEN   rest LIKE '%' + CHAR(13) + CHAR(10) + '[0-9]%'
               THEN   substring(rest,patindex('%' + CHAR(13) + CHAR(10) + '[0-9]%',rest)+2,datalength(rest))
               ELSE   NULL
               END )
   FROM   temp
   WHERE   rest IS NOT NULL
   )
SELECT   itemcode,subitem,alternativmaterial
FROM   temp
ORDER BY itemcode,subitem
Das mit right() ist mir echt schleierhaft...
 
Werbung:
Wenn du das Prinzip durchschaust kriegst du es auch debugged, der erste Select zeigt mit der right()-Funktion alles als Rest an, das kann irgendwie nicht funktionieren :)
 
Zurück
Oben