none
BULK INSERT Zeichensatz Utf-8 + Null Werte RRS feed

  • Frage

  • Liebe Experten,

    gegeben: 

    Version: Microsoft SQL Server 2008 (SP4) - 10.0.6535.0 (X64)   Apr 17 2015 19:49:03   Copyright (c) 1988-2008 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)

    Tabelle:

    CREATE TABLE [dbo].[Table](
        [DeleteFlag] [char](1) NULL,
        [JobNo.] [decimal](6, 0) NULL,
        [OperatorCode] [char](2) NULL,
        [CompanyCode] [char](3) NULL,
        [PartsCode] [char](10) NULL,
        [CurrencyCode] [char](3) NULL,
        [PriceType(PartsSales)] [char](3) NULL,
        [ManualInputFlag] [decimal](1, 0) NULL,
        [CurrentPrice] [decimal](15, 2) NULL,
        [PriceApplyDateYy] [decimal](4, 0) NULL,
        [PriceApplyDateMm] [decimal](2, 0) NULL,
        [PriceApplyDateDd] [decimal](2, 0) NULL,
        [RegistrationDate] [decimal](6, 0) NULL,
        [RegistrationTime] [decimal](6, 0) NULL,
        [UpdateDate] [decimal](6, 0) NULL,
        [UpdateTime] [decimal](6, 0) NULL,
        [RRN] [int] NULL,
        [ChangedDate] [datetime] NULL
    ) ON [PRIMARY]
    
    ALTER TABLE [dbo].[VF3MP] ADD  DEFAULT (getdate()) FOR [ChangedDate]

    Es sollen .txt Dateien importiert werden. Beim Bulk Insert erscheint Fehler:

    BULK INSERT dbo.Table
    FROM '\\Server\e$\Rohdaten\Data_Transfer\NewPrices13032018\Folder\NewPrices.txt'  
    WITH  
    ( CODEPAGE = 'RAW',
    KEEPNULLS);  


    Msg 4864, Level 16, State 1, Line 1 Datenkonvertierungsfehler beim Massenladen (Typenkonflikt oder ungültiges Zeichen für die angegebene Codepage) für 1-Zeile, 2-Spalte (JobNo.). Msg 4864, Level 16, State 1, Line 1 Datenkonvertierungsfehler beim Massenladen (Typenkonflikt oder ungültiges Zeichen für die angegebene Codepage) für 2-Zeile, 2-Spalte (JobNo.). Msg 4864, Level 16, State 1, Line 1 Datenkonvertierungsfehler beim Massenladen (Typenkonflikt oder ungültiges Zeichen für die angegebene Codepage) für 3-Zeile, 2-Spalte (JobNo.). Msg 4864, Level 16, State 1, Line 1 Datenkonvertierungsfehler beim Massenladen (Typenkonflikt oder ungültiges Zeichen für die angegebene Codepage) für 4-Zeile, 2-Spalte (JobNo.)

    es ist unmöglich mit dem Text Editor die Daten zu öffnen und anzuschauen, dennoch habe ich vermutet dass es um die UTF-8 Zeichensätze gehen konnte und habe folgendes Versucht: eine neue tabelle erstellt, wo alle Spalten von Datentyp nvarchar(255) sind und der Bulk insert Läuft fast bis zu Ende. Allerdings dann kommt folgende Fehlermeldung:

    Msg 4832, Level 16, State 1, Line 1
    Massenladen: Unerwartetes Dateiende in der Datendatei.
    Msg 7399, Level 16, State 1, Line 1
    Der OLE DB-Anbieter 'BULK' für den Verbindungsserver '(null)' hat einen Fehler gemeldet. Der Anbieter hat keine Informationen zu dem Fehler bereitgestellt.
    Msg 7330, Level 16, State 2, Line 1
    Eine Zeile kann nicht vom OLE DB-Anbieter 'BULK' für den Verbindungsserver '(null)' abgerufen werden.
    Welche Dateiende kann ich denn vorgeben, wenn ich es nicht mal öffnen kann? Was kann ich hier tun?

    Gruß & dank

    Irina


    Irina


    Mittwoch, 14. März 2018 09:37

Antworten

Alle Antworten

  • Hi,

    warum kannst Du die Datei nicht mit einem Texteditor öffnen?

    Poste die Datei doch mal online (bspw. in deinem zum Live Konto zugehörigen OneDrive), dann kann man sich das anschauen.

    Ich würde allerdings das mehr als 10 Jahre alte DBMS mal gegen was halbwegs aktuelles austauschen. Dann kannst Du auch UTF-8 importieren. Geht dann über CODEPAGE = '65501' (ab SQL Server 2014 SP 2)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Mittwoch, 14. März 2018 09:51
    Moderator
  • Danke für Dein Antwort. Niemand postet interne Daten online. Ein SQL Server Upgrade steht aktuell nicht zu debate.

    Der Notepad ist leider nicht im Stande eine Unicode Datei mit nehreren Millionen Zeilen korrekt zu öffnen.

    Der Import soll halt unter gegebenen Bedingungen erfolgen. das UTF-8 zeichensatz ist, glaube ich durch den Datentyp nvarchar(255) "übersetzt". Es bleibt nur das Problem:

    Msg 4832, Level 16, State 1, Line 1
    Massenladen: Unerwartetes Dateiende in der Datendatei.
    Msg 7399, Level 16, State 1, Line 1
    Der OLE DB-Anbieter 'BULK' für den Verbindungsserver '(null)' hat einen Fehler gemeldet. Der Anbieter hat keine Informationen zu dem Fehler bereitgestellt.
    Msg 7330, Level 16, State 2, Line 1
    Eine Zeile kann nicht vom OLE DB-Anbieter 'BULK' für den Verbindungsserver '(null)' abgerufen werden.


    Irina

    Mittwoch, 14. März 2018 10:15
  • Hi,

    a) kann keiner wissen, dass deine Datei dermaßen groß ist.

    b) gibt es UltraEdit, Notepad++ und weitere Editoren, die das trotzdem können.

    c) Ist die Datei keine Unicode Datei, sonst würde es ja auch mit der von dir verwendeten Version funktionieren

    d) Ohne die Datei zu kennen kann man das halt nicht beantworten

    Daher: Poste die Datei bzw. einen kleinen Auszug davon (Headerzeile, falls vorhanden + 4-5 Datenzeilen), wenn notwendig, anonymisiert.

    Sieh es mal so: Derzeit sieht es für uns so aus:

    Du: "Das Auto springt nicht an"

    Wir: "Zeig mal das Auto"

    Du: "Nö"

    Und darum brauchen wir die Datei bzw. deren exakten Aufbau und Beispieldaten.

    Falls Du das immer noch nicht willst, lies dich bitte in die Dokumentation zu BULK INSERT und den Einstellungsmöglichkeiten ein.

      Angeben von Feld- und Zeilenabschlusszeichen (SQL Server)

      Formatdateien zum Importieren oder Exportieren von Daten (SQL Server)

      ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 14. März 2018 10:22
    Moderator
  • Hallo Irina,

    Du könntest mal von einer Eingabezeile aus ein type versuchen:

    type datei.txt | more

    Alternativ könnte evtl. Notepad++ helfen.

    SQL Server 2008 geht im nächsten Sommer aus dem extended Support und spätestens dann solltet ihr einen Ersatz haben.



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

    Mittwoch, 14. März 2018 10:30
  • das UTF-8 zeichensatz ist, glaube ich durch den Datentyp nvarchar(255) "übersetzt".

    Hallo Irina,

    NVarchar kann Unicode speichern, was etwas anderes ist als UTF-8. Der SQL Server unterstützt kein UTF, da kommst Du nicht rum, die Quelldatei erst nach Unicode zu konvertieren.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 14. März 2018 12:21
  • so sehen die Daten aus, offensichtlich mit dem Nvarchar ist es nicht getan!

    kan man da was tun? Ich habe die Anleitung zum BULK INSERT gelesen keins der Optionen hilft. CODEPAGE = '65501' wird aktuell nicht unterstutzt.


    Irina

    Mittwoch, 14. März 2018 12:33
  • Hallo Christof, danke sehr! So sehen die Daten aus (s. unten). Es handelt sich um einen fremden Server. Der Opponent wurde bereits über den Patchstatus seiner SQL Server informiert. Aktuell müssen wir irgendwie die Daten rein kriegen. Sind die Daten überhaupt zu gebrauchen?


    Irina



    • Bearbeitet soarian2 Mittwoch, 14. März 2018 12:50
    Mittwoch, 14. März 2018 12:48
  • Hallo Olaf! Vielen Dank. Wie konvertiere ich es nach Unicode? Ich wusste nur von den CODEPAGE optionen, welche nichts bewirken. Ich habe einige Codepages ausprobiert, unter Anderem 65000, 1200, 1201 usw. Es bleibt nicht lesbar!


    Irina

    Mittwoch, 14. März 2018 13:09
  • Hi,

    die Daten sehen ziemlich kaputt aus. Sieht für mich nicht nach einer Textdatei aus.

    Sollte es doch eine sein, lass dir vom Ersteller der Datei mal sagen, welches Encoding exakt dafür verwendet wurde. UTF-8 isses schon mal nicht. Unicode auch nicht. ASCII, ISO-8859-1 oder irgendwas anderes, was man normalerweise verwendet, auch nicht.

    Alles natürlich davon ausgehend, dass der Inhalt auch nur halbwegs lesbare Zeichen und Zahlenfolgen sein sollten. Falls da irgendwelche codierten/verschlüsselten/... Werte enthalten sind, kann der Inhalt natürlich schon Sinn ergeben, ist dann aber für dich unbrauchbar, da das über SQL nicht importiert bzw. decodiert werden kann.

    ---

    Auch wenn ich damit wohl gegen Windmühlen ankämpfe: Stell die Datei bzw. einen (ggfs. anonymiserten) Auszug davon online zum Download zur Verfügung. Kann doch nicht so schwer sein.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Mittwoch, 14. März 2018 13:10
    Moderator
  • Hi Stefan, wenn ich nicht weiß was drinnen steht, weiß ich auch nicht, was davon anonymisiert werden soll.:)

    Ich habe jezt verschiedene Codepages ausprobiert und auch das Ganze auf dem SQL 2016 mit  CODEPAGE = '65501' (wie Du geschrieben hast) versucht. Es bleibt "abra-kadabra". Ich habe jezt gebetten neu daten zu erzeugen und darauf zu achten welchen Zeichenzatz sie dabei verwenden.

    Danke und Gruß

    Irina


    Irina

    Mittwoch, 14. März 2018 14:56
  • Nodepad++ hilft da i.d.R. auch bei großen Dateien.
    In der CMD-Box gibt es keine Unicode-Unterstützung, daher kann man chinesisch da auch nicht darstellen.

    Allerdings sehen die Daten tatsächlich eher binär als alles andere aus, da ja nichts lesbar ist.
    Das sieht auch eher nach einem Backup als einem CSV-Export aus.
    Zeile 1: Spaltennamen
    Zeile 2ff: Datenfelder je Datenzeile, i.d.R. durch Semikolon getrennt:

    F1;F2;f3;....
    W1;W2;W3;...
    W1;W2;W3;...
    W1;W2;W3;...

    Mittwoch, 14. März 2018 15:10
  • Hallo Irina,

    darum hatte ich dir ja geschrieben, dass es auch noch UltraEdit, Notepad++, usw. gibt. Die können auch mit großen Dateien umgehen und teils auch automatisch erkennen, welches Encoding verwendet wurde (und konvertieren ist ggfs. auch möglich, kommt aber auf das Quellformat an)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 14. März 2018 15:32
    Moderator
  • Unabhängig von den genannten Tools:
    Die Daten müssten bis auf wenige Sonderzeichen auch in einer DOS-Box im Klartext lesbar sein, wenn sie denn tatsächlich CSV-basiert wären.
    Wie auf dem Bild zu sehen, ist dies ja definitiv nicht der Fall und somit kann es sich nicht um CSV-Daten handeln.
    Mittwoch, 14. März 2018 15:39
  • Hallo Irina,

    wenn es weniger als 1Mio Datensätze sind, könntest Du die Datei auch mit Excel öffnen und sie damit importieren Link


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Donnerstag, 15. März 2018 00:02
  • Nützt natürlich nichts bei Binärdaten;-).
    Donnerstag, 15. März 2018 09:47
  • Ich glaube nicht, dass es Binärdaten sind. Eher ein sehr ungewöhnliches Encoding oder keine Daten in Reinform, sondern irgendwie nochmal gesondert umgeschrieben.

    Aber das kann nur der Datenlieferant beantworten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 15. März 2018 10:01
    Moderator
  • Hallo Irina,

    gibt es dazu schon etwas neues? Oder hat sich das Problem mittlerweile erledigt?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 22. März 2018 07:30
    Moderator
  • Oh - Entschuldigung. Ist irgendwie in Vergangenheit gerückt...

    Es waren tatsächlich fehlerhafte Daten. Danke - Problem erledigt


    Irina

    Freitag, 27. September 2019 12:41