none
CSV Exportproblem bei SQL Servermanagement STUDIO RRS feed

  • Frage

  • Hallo allerseits,

    ich habe ein Problem, welches mich zum Wahnsinn treibt. Ich benutze Server Management Studio und erzeuge mit dem Export-Assistenten eine CSV Dtaei. Dieser gebe ich eine SQL Abfrage mit auf dem Weg. Das Abfrage Ergebnis enthält einige 1000 Zeilen, und sieht oberflächlich betrachtet ok aus (Notepad), Feldtrenner ; und Zeilentrenner Tabstops. Nun importiere ich die Datei in Excel 2010 mit dem Import Assistenten. Die ersten paar 100 Zeilen sind auch ok, dann ist in einem Feld ein CR und es wird ein neuer Datensatz generiert, der Form dass, der restliche Text der letzten spalte in einem neuen Datensatz im ersten Feld erscheint. Was kann man dagegen machen, weis jemand Bescheid, danke im Voraus

    Gruss

    Chris

    Donnerstag, 7. Juni 2018 08:38

Antworten

  • Es sollte doch feststellbar sein (Notepad, Notepad++) in genau welchem Feld der Zeilenumbruch stattfindet.

    Genau für diese/s Feld/er musst du die CR/LF's entfernen.

    Dies ist kein Microsoft-Problem.

    Alternativ kannst du in Excel aber ganz einfach über "Daten->Externe Daten abrufen" komfortabel über MS-Query daten in Excel laden.

    • Als Antwort markiert Chris4712 Donnerstag, 14. Juni 2018 05:39
    Freitag, 8. Juni 2018 14:20
  • Vielleicht hast du da auch nie CR/LF's gespeichert?

    Wenn du deinen SQL nimmst, dann ersetzt du "char(10) + char(13)", also das Vorkommen von LF+CR!
    Die Kombination ist aber normalerweise CR+LF, als "char(13) + char(10)".
    Deshalb, um sicher zu gehen, solltest du die Replaceanweisung ja schachteln und jedes Zeichen einzeln ersetzen, so dass die Reihenfolge und Anzahl egal ist (was schon mal vorkommen kann):

    REPLACE(REPLACE(CAST(Ob_F20 AS nvarchar(max)),char(10), ''), char(13), '')

    Wenn du dich nicht an die Vorschläge hältst, darfst du dich nicht wundern wenn es nicht klappt.
    Außerdem verlierst du u.U. Zeichenqualität, wenn du den cast nicht auf nvarchar, also Unicode, durchführst,

    • Als Antwort markiert Chris4712 Donnerstag, 14. Juni 2018 05:38
    Samstag, 9. Juni 2018 14:25

Alle Antworten

  • Tabstopp als Zeilentrenner? Das funktionert i.d.R. nicht.

    Aber:
    Wenn du z.B. in deiner SQL-Tabelle ein Textfeld (Memo) hast, können dort ja CR's vorhanden sein.
    Diese sind dann beim Export zu entfernen, da sie sonst die CSV-Struktur zerstören.

    REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

    Donnerstag, 7. Juni 2018 09:07
  • Hallo Chris,

    Du kannst beim Export einen "Textqualifizierer" angeben. Nimm dort doppelte Hochkommata, dann sollte Excel verstehen, wo die Spalte zu Ende ist.

    Problematisch wird es, wenn Du auch doppelte Hochkommata in den Daten hast. Diese musst Du dann erst doppeln, indem Du den Export nicht aus der Tabelle, sondern aus einer View oder einem entsprechenden Select machst.

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 7. Juni 2018 09:34
    Beantworter
  • Also muss ich im studio nichts weiter einstellen? Beim Import Assistenten von Excel ist " als Textqualifizierer bei mir schon standardmäßig eingestellt, ich hatte extra beim Export Tabstops als Zeilentrennzeichen und ; als Spaltentrener gewählt, damit er mir den CR in den Textfeldern nicht durcheinander kommt, denke mal dafür ist die Auswahl auch da.

    @bfuerchau: Danke für den String: 

    REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '
    wo schreib ich den den rein, da wo ich die Abfrage eingebe?
    Muss ich vielleicht im Importassi noch anhacken : Aufeinanderfolgende Trennzeichen als ein Zeichen behandeln?
    • Bearbeitet Chris4712 Donnerstag, 7. Juni 2018 09:53
    Donnerstag, 7. Juni 2018 09:51
  • Genau, das ist Bestandteil deiner Abfrage.

    CSV ist leider nicht dafür geeignet, CR/LF als Datenteil zu interpretieren.
    Du solltest am Default (Feldtrenner ";", Zeilentrenner CR/LF) nichts ändern.
    Excel hat als Feldtrenner da leider default den TAB, obwohl:

    CSV = Comma seperatet values

    Donnerstag, 7. Juni 2018 10:01
  • Beim Export musst Du den Textqualifizierer zuerst angeben!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 7. Juni 2018 10:16
    Beantworter
  • Danke erstmal an alle die versuchen Hilfe zu leisten. Ich habe nun in Studio im Exportassistenten " als Qualifier angegeben, trotzdem sind wieder einige Datensätze wo sich offenbar dieses CR eingeschlichen hat enthalten und führen zu neuen Datensätzen, es ist zum Mäusemelken.

    Habe mir das mal in einem Editor angeschaut und bei diesen kaputten Zeilen liegt das CR, was da nicht hingehört, hinter dem "-Zeichen-. Ist das vielleicht ein Problem der Codierung oder unicode? was ist zu verwenden?

    LG Chris

    • Bearbeitet Chris4712 Donnerstag, 7. Juni 2018 12:19
    Donnerstag, 7. Juni 2018 12:13
  • Wenn Du den Export nicht auf die Tabelle machst, sondern auf ein Select und dort an der richtigen Stelle das Statement von bfuerchau einbaust (also für die Spalte welche das CR oder LF enthält), sollte es gehen!

    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 7. Juni 2018 12:23
    Beantworter
  • Meinst du das in etwa so?

    USE DB;
    
    SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10)   Ob_id,Ob_F12,Ob_F37,Ob_F2,Ob_F3,B_intAbk,ob_f20
    FROM M_Objekte1 INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    
    WHERE
    (Ob_f37 = '150')
     
    ORDER BY M_Objekte1.B_Id ASC,Ob_F2 ASC,OB_ID ASC


    • Bearbeitet Chris4712 Donnerstag, 7. Juni 2018 12:41
    Donnerstag, 7. Juni 2018 12:40
  • Prüfe, ob du wirklich jedes Feld ersetzen musst, also in jedem Feld CR's vorkommen können.
    Ansonsten hatte ich den Link gepostet.
    Der Replace ist je Feld einzeln durchzuführen:

    select
    REPLACE
    (REPLACE(Ob_F12, CHAR(13), ''), CHAR(10) as Ob_F12,
    REPLACE(REPLACE(Ob_F37, CHAR(13), ''), CHAR(10) as Ob_F37,

    ...

    Zugegeben mühsam, aber wie gesagt, nicht jede Spalte erlaubt ja CR's.

    Donnerstag, 7. Juni 2018 12:46
  • USE test;
    
    SELECT 
    Ob_id,
    REPLACE(REPLACE(Ob_F12, CHAR(13), ''), CHAR(10) as Ob_F12,
    Ob_F37,Ob_F12,Ob_F2,Ob_F3,ob_f20
    FROM M_Objekte1
    Also bei mir kommt dann nen  Fehler
    Meldung 156, Ebene 15, Status 1, Zeile 5
    Falsche Syntax in der Nähe des 'as'-Schlüsselwortes.
    Kann doch irgendwie nicht sein dass so ein CSV Export einem so schwer gemacht wird


    • Bearbeitet Chris4712 Freitag, 8. Juni 2018 05:12
    Donnerstag, 7. Juni 2018 13:12
  • Tippfehler von mir ;-):

    REPLACE(REPLACE(Ob_F12, CHAR(13), ''), CHAR(10)) as Ob_F12,


    Nicht der CSV-Export ist das Problem, deine Daten sind problematisch.
    Das kann aber schon mal vorkommen.
    Donnerstag, 7. Juni 2018 13:37
  • Und was heisst das jetzt für mich? kann ich den Export vergessen, oder muss ich aus sämtlichen Datensätzen wo das Problem vorhanden ist händisch die CR rauslöschen? Oh seh gerade hattest dich ja verbessert, probiere es nachher noch mal, danke
    • Bearbeitet Chris4712 Freitag, 8. Juni 2018 05:11
    Freitag, 8. Juni 2018 05:04
  • Also ich habs jetzt so, aber schon wieder nen Fehler:(

    USE Archiv82test;
    
    SELECT 
    Ob_id,
    REPLACE(REPLACE(Ob_F12, CHAR(13), ''), CHAR(10)) as Ob_F12,
    Ob_F37,Ob_F12,Ob_F2,Ob_F3,ob_f20
    FROM M_Objekte1
    
    Meldung 174, Ebene 15, Status 1, Zeile 5
    Die replace-Funktion erfordert 3 Argument(e).
    Die Sache ist die, ich hatte vor einiger Zeit schon einmal was exportiert, allerdings ohne Join Verknüpfung und da war alles sauber, es muss also rein mit den Einstellmöglichkeiten hinzubekommen sein


    • Bearbeitet Chris4712 Freitag, 8. Juni 2018 05:20
    Freitag, 8. Juni 2018 05:15
  • Wie die Fehlermeldung schon sagt, fehlt beim äußeren REPLACE das 3te Argument, also das hintere , '':

    SELECT Ob_id,REPLACE(REPLACE(Ob_F12, CHAR(13), ''), CHAR(10), '') as Ob_F12,


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Freitag, 8. Juni 2018 06:32
  • Also ich muss mit Blindheit gestraft sein, ich hab mein Script jetzt so und außer dass das das Feld ein anderes ist, seh ich keinen Unterschied
    USE Archiv82test;
    GO
    SELECT Ob_id,Ob_F2,Ob_F3,
     REPLACE(REPLACE(Ob_F20,CHAR(13),"),"),CHAR(10),") as Ob_F20,
      
    FROM M_Objekte1
    WHERE 
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_ID ASC,Ob_F2 ASC,OB_ID ASC
    
    
    ----------------------------
    
    Meldung 103, Ebene 15, Status 4, Zeile 2
    Bezeichner (beginnend mit ') as Ob_F20,
      
    FROM M_Objekte1
    WHERE 
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_ID ASC,Ob_F2 ASC,O') ist zu lang. Die maximal zulässige Länge beträgt 128.
    Meldung 105, Ebene 15, Status 1, Zeile 2
    Kein schließendes Anführungszeichen nach der Zeichenfolge ') as Ob_F20,
      
    FROM M_Objekte1
    WHERE 
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_ID ASC,Ob_F2 ASC,OB'.
    Meldung 102, Ebene 15, Status 1, Zeile 2
    Falsche Syntax in der Nähe von ') as Ob_F20,
      
    FROM M_Objekte1
    WHERE 
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_ID ASC,Ob_F2 ASC,O'.

    Freitag, 8. Juni 2018 07:00
  • Betrachte mal genau die Syntax!!!

    REPLACE(REPLACE(Ob_F20,CHAR(13),"),CHAR(10),") as Ob_F20,

    Freitag, 8. Juni 2018 07:17
  • So habs jetzt genausso(copy und paste) 

    REPLACE(REPLACE(Ob_F20,CHAR(13),"),"),CHAR(10),") as Ob_F20, 

    immer noch dieselbe Fehlermeldung wie eben:(

    Freitag, 8. Juni 2018 07:54
  • Das sind keine doppelten Hochkommata, sondern zwei einzelne!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Freitag, 8. Juni 2018 08:17
    Beantworter
  • Das auf jeden Fall, aber Copy/Paste glaube ich nun nicht, da immer noch ein Argument zu viel drin steht:

    REPLACE(REPLACE(Ob_F20,CHAR(13),")     ,")     ,CHAR(10),") as Ob_F20,

    Freitag, 8. Juni 2018 08:34
  • Also wir reden aneinander vorbei, bei

    REPLACE(REPLACE(Ob_F20,CHAR(13),")     ,")     ,CHAR(10),") as Ob_F20,

    sehe ich nach (13), ein Anführungszeichen und nicht 2 Hochkommata und beim Kopieren bleiben es auch Anführungszeichen.

    Freitag, 8. Juni 2018 09:04
  • Gut, optisch ist das immer ein Problem. Es war mein Fehler deinen Code zu kopieren der bereits Anführungszeichen enthält.
    Schau noch mal bitte genau auf die 1. Antwort:

    REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

    Wie du siehst: Hochkommata.
    Nun ersetze @str durch deine Variable:

    REPLACE(REPLACE(MyVar, CHAR(13), ''), CHAR(10), '') as MyVar

    Ist das nun verständlich genug;-)?

    Freitag, 8. Juni 2018 09:20
  • Also hier im Forum sehe ich Anführungszeichen, also die einzelnen wären für mich Hochkommata, wenn ich

    REPLACE(REPLACE(Ob_F20, CHAR(13), ''), CHAR(10), '')

    USE test;
    GO
    
    SELECT Ob_id,Ob_F2,Ob_F3,
    REPLACE(REPLACE(Ob_F20, CHAR(13), ''), CHAR(10), '')
    
    FROM M_Objekte1
    WHERE 
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_ID ASC,Ob_F2 ASC,OB_ID ASC
    
    


    kopiere und OB_F20 einsetze, werden daraus Hochkommata. Resultierender Fehler

    Meldung 8116, Ebene 16, Status 1, Zeile 2
    Der Argumentdatentyp ntext ist für das 1-Argument der replace-Funktion ungültig.
    

    Freitag, 8. Juni 2018 09:40
  • Auch dafür gibts eine Lösung:

    http://www.sidesofmarch.com/index.php/archive/2008/02/27/how-to-use-replace-within-ntext-columns-in-sql-server/

    Freitag, 8. Juni 2018 09:50
  • Hätte ich erwähnen müssen, dass es sich um ein NTEXT Feld handelt?
    Freitag, 8. Juni 2018 10:07
  • Nein das nicht, aber, das soll jetzt kein Vorwurf sein, manchmal hilft da das Bemühen von Suchmaschinen außerordentlich;-)!
    Freitag, 8. Juni 2018 10:21
  • genau das habe ich getan (auch kein Vorwurf) und da habe ich eben gefunden dass es bei NTEXT nicht mit REPLACE geht;)

    siehe:https://www.sqlservercentral.com/Forums/Topic257985-8-1.aspx

    Und genau dieses bemängelt ja auch die Fehlermeldung, wen ich richtig lese
    • Bearbeitet Chris4712 Freitag, 8. Juni 2018 11:14
    Freitag, 8. Juni 2018 11:13
  • Und in meinem obigen Link steht, dass man NTEXT in VARCHAR casten soll, dann klappt auch wieder Replace.
    Schau dir den Link bzgl. des genauen Beispiels mal an.

    Das Problem bei den Suchen ist tatsächlich, dass man auf den englischen Seiten oft mehr findet.
    Als Programmierer sollte man sich damit dann beschäftigen.

    Freitag, 8. Juni 2018 11:17
  • Ja da geb ich dir recht, das hatte ich zwischenzeitlich auch getan, bin dann zu diesem Konstrukt gekommen, welches aber auch wieder einen Fehler meldet
    USE test;
    
    SELECT Ob_id,Ob_F2,Ob_F3,ob_f20,B_intAbk
    REPLACE(CAST(Ob_F20 AS varchar(max)),char(10) + char(13), ''))
    FROM M_Objekte1 INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    
    WHERE
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_Id ASC,Ob_F2 ASC,OB_ID ASC
    
    ---------------------
    Meldung 102, Ebene 15, Status 1, Zeile 4
    Falsche Syntax in der Nähe von 'CAST'.



    • Bearbeitet Chris4712 Freitag, 8. Juni 2018 11:43
    Freitag, 8. Juni 2018 11:42
  • So jetzt macht er, es obs das Problem löst werde ich sehen

    USE test;
    
    SELECT Ob_id,Ob_F2,Ob_F3,ob_f20,B_intAbk,
    cast(replace(cast(ob_F20 as nvarchar(max)),char(10) + char(13),'') as ntext)
    
    FROM M_Objekte1 INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    
    WHERE
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_Id ASC,Ob_F2 ASC,OB_ID ASC
    


    • Bearbeitet Chris4712 Freitag, 8. Juni 2018 11:56
    Freitag, 8. Juni 2018 11:56
  • Beim Excelimport sind nach wie vor an einigen Stellen innerhalb eines Feldes Zeilenumbrüche, wo sie nicht hingehören. War ja zu erwarten, das Microsoft für so eine Routineaufgabe keien Lösung hat.
    Freitag, 8. Juni 2018 13:15
  • Es sollte doch feststellbar sein (Notepad, Notepad++) in genau welchem Feld der Zeilenumbruch stattfindet.

    Genau für diese/s Feld/er musst du die CR/LF's entfernen.

    Dies ist kein Microsoft-Problem.

    Alternativ kannst du in Excel aber ganz einfach über "Daten->Externe Daten abrufen" komfortabel über MS-Query daten in Excel laden.

    • Als Antwort markiert Chris4712 Donnerstag, 14. Juni 2018 05:39
    Freitag, 8. Juni 2018 14:20
  • Ja natürlich , es handelt sich um das Feld F20, wie man an meiner Abfrage schon sehen kann. Und diese CR Zeichen kommen nicht regelmäßig sondern mal alle paar 100 Datensätze, also keine chance das händisch zu entfernen

    schönes we 

    vielleicht ist es kein mS problem, sondern ein MS SQL problem, bei MySQL habe ich solche Probleme nie gehABT:

    chris

    Freitag, 8. Juni 2018 20:46
  • Vielleicht hast du da auch nie CR/LF's gespeichert?

    Wenn du deinen SQL nimmst, dann ersetzt du "char(10) + char(13)", also das Vorkommen von LF+CR!
    Die Kombination ist aber normalerweise CR+LF, als "char(13) + char(10)".
    Deshalb, um sicher zu gehen, solltest du die Replaceanweisung ja schachteln und jedes Zeichen einzeln ersetzen, so dass die Reihenfolge und Anzahl egal ist (was schon mal vorkommen kann):

    REPLACE(REPLACE(CAST(Ob_F20 AS nvarchar(max)),char(10), ''), char(13), '')

    Wenn du dich nicht an die Vorschläge hältst, darfst du dich nicht wundern wenn es nicht klappt.
    Außerdem verlierst du u.U. Zeichenqualität, wenn du den cast nicht auf nvarchar, also Unicode, durchführst,

    • Als Antwort markiert Chris4712 Donnerstag, 14. Juni 2018 05:38
    Samstag, 9. Juni 2018 14:25
  • ok die schachtelung hatte ich vergessen, probier ich am montag noch mal, danke

    schönen Sonntag noch

    Samstag, 9. Juni 2018 22:09
  • Hallo allerseits, eigentlich dachte ich kurz vor einer Erfolgsmeldung zu stehen, wenn ich die Abfrage in Studio mache erhalte ich meine gewünschten ca 600000 Datensätze, wenn ich aber über den Exportassi gehe wird keine einzige Zeile geschrieben, mein code sieht nun so aus, wie hier vorgeschlagen.

    SELECT Ob_id,Ob_F2,Ob_F3,B_intAbk,
    REPLACE(REPLACE(CAST(Ob_F20 AS nvarchar(max)),char(10), ''), char(13), '')
    
    FROM M_Objekte1 INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    
    WHERE
    (Ob_f2 LIKE '%xxx%')
     OR
     (Ob_f2 IS NULL)
    ORDER BY M_Objekte1.B_Id ASC,Ob_F2 ASC,OB_ID ASC
    
    
    --------
    Fehler 0xc020802e: Datenflusstask: 'Eingabespalte 'Titel' (46)' weist den DT_NTEXT-Datentyp auf, der bei ANSI-Dateien nicht unterstützt wird. Verwenden Sie stattdessen DT_TEXT, und konvertieren Sie die Daten mithilfe der Datenkonvertierungskomponente in DT_NTEXT.
     (SQL Server-Import/Export-Assistent)
     
    Fehler 0xc004706b: Datenflusstask: Fehler beim Überprüfen von 'Komponente 'Ziel - XXXundLEER21_csv' (31)'. Überprüfungsstatus: 'VS_ISBROKEN'.
     (SQL Server-Import/Export-Assistent)
     
    Fehler 0xc004700c: Datenflusstask: Fehler beim Überprüfen von mindestens einer Komponente.
     (SQL Server-Import/Export-Assistent)
    

    Bin langsam am verzweifeln

    Montag, 11. Juni 2018 05:42
  • Hallo Chris,

    du solltest vorab die Ziel-Datei einmal löschen, die überarbeitete Spalte (Replace...) sollte einen Namen bekommen (as OB_F20_Neu).

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Montag, 11. Juni 2018 05:59
    Beantworter
  • " der bei ANSI-Dateien nicht unterstützt"

    Du erstellst eine CSV-Datei, die kein Unicode unterstützt.
    Für den Export solltest du hier UTF-8 verwenden:

    https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-2017

    bcp ..... -c 65001

    Wie du das beim Assistenten angibst kann ich dir nicht sagen.

    Montag, 11. Juni 2018 07:00
  • UTF hatte ich verwendet, mittlerweile hat es übrigens geklappt, waren noch 2 weitere Felder betroffen, die ich casten musste, Vielen Dank noch mal für eure Mithilfe und einen schönen Tag

    Gruss

    chris

    Dienstag, 12. Juni 2018 05:17
  • Dann markiere bitte noch die Antworten, die dir hilfreich waren;-).
    Dienstag, 12. Juni 2018 07:15