Mám datový soubor ve formátu txt a použil jsem jej načíst pomocí hromadného vložení v následujícím příkazu:
Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", )
Kód funguje dobře. Když jsem se však pokoušel použít soubor formátu s hromadnou vložkou k načtení souboru, narazil jsem na určité problémy se specifikováním zakončení pole pro poslední řádek.
Zde je specifikace posledního řádku v formát souboru:
21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS
S terminálem „0x0a“ se zobrazí následující chyba:
Chyba převodu dat hromadného načtení (zkrácení) pro řádek 2, sloupec 1 (var1).
S „\ n“ mohou data být načten, ale „|“ je také načten v posledním sloupci. Například dostanu „0,5 |“ místo „0,5“.
„| \ n“, „0x0a“, „| 0x0a“, „\ r \ n“ vrací stejnou chybu jako „|“
Chyba převodu dat hromadného načtení (zkrácení) pro řádek 2, sloupec 1 (var1).
I “ m pomocí serveru sql-server 2016, Windows 10 64bit.
Může s tím někdo pomoci? Za vaši pomoc předem děkujeme!
Jason
Komentáře
- Jelikož jste ' položili o tom několik otázek, podívejte se na tuto stránku: sommarskog.se/bulkload.html
- @sp_BlitzErik, děkuji za odpověď! Tento článek je velmi užitečný a poskytuje mnohem více informací než web MSDN. Při čtení příkladu v části 4.1 , Zaměnil jsem se s terminátorem pole " \ " \ r \ n ", citát je poznámka opravdu kompletní, je to typ?
- Pokud si dobře pamatuji, je to ' úniková sekvence. ding there ' je lepší vysvětlení dále dolů.
Odpověď
Po celodenním boji s kódem Line Feed / Hex jsem konečně zjistil, že můj problém byl způsoben chybějícími sloupci ve formátu souborů. Datová sada je pro mě nová a myslel jsem si, že má 21 řádků, zatímco ve skutečnosti má 22 řádků. Proto sql server stále načítal poslední „|“ z datového souboru.
Zde je odkaz pro ostatní, kteří by se mohli zajímat o načítání datového souboru ze systému UNIX se zakončovacími řádky odlišnými od Windows, existují tři metody:
- použít hromadné vložení a nastavit zakončení řádku na „0x0a“.
- použít formátovací soubor a nastavit zakončení pole posledního pole na „\ n „.
- Použijte dynamický sql s funkcí Char (10) pro vložení řádku (LF) do příkazového řetězce a poté proveďte () příkazový řetězec.
Než vyzkoušíte tyto metody, použijte poznámkový blok k zobrazení všech řídicích znaků k potvrzení řídicích znaků použitých v textových souborech.
Pokud pro vás žádná z těchto metod nefunguje, můžete mít kromě řádku i jiné problémy zakončení zdroje / řádku.