Mam plik danych w formacie txt i ładowałem go za pomocą funkcji Bulk Insert w następującym poleceniu:
Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", )
Kod działa dobrze. Jednakże, gdy próbowałem użyć pliku formatu z wstawieniem zbiorczym do załadowania pliku, napotkałem pewne problemy z określeniem terminatora pola dla ostatniego wiersza.
Oto specyfikacja ostatniego wiersza w format pliku:
21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS
Z „0x0a” jako terminatorem otrzymuję następujący błąd:
Błąd konwersji (obcięcie) danych zbiorczego ładowania dla wiersza 2, kolumny 1 (var1).
Z „\ n” dane mogą być załadowane, ale „|” jest również ładowany w ostatniej kolumnie. Na przykład otrzymuję „0,5 |” zamiast „0,5”.
”| \ n”, „0x0a”, „| 0x0a”, „\ r \ n” zwraca ten sam błąd co „|”
Błąd konwersji danych (obcięcie) podczas zbiorczego ładowania danych dla wiersza 2, kolumny 1 (var1).
I ” m używając sql-server 2016, Windows 10 64bit.
Czy ktoś może w tym pomóc? Z góry dziękuję za pomoc!
Jason
Komentarze
- Ponieważ ' zadałeś teraz kilka pytań na ten temat, przyjrzyj się tej stronie: sommarskog.se/bulkload.html
- @sp_BlitzErik, dziękuję za odpowiedź! Ten artykuł jest bardzo przydatny i zawiera znacznie więcej informacji niż witryna MSDN. Podczas czytania przykładu pod 4.1 , Pomyliłem się z terminatorem pola " \ " \ r \ n ", cytat to notatka naprawdę kompletna, czy to typ?
- Jeśli dobrze pamiętam, jest to ' sekwencja ucieczki. Jeśli zachowasz ding there ' to lepsze wyjaśnienie poniżej.
Odpowiedz
Po całym dniu zmagania się z kodem Line Feed / Hex, w końcu stwierdziłem, że mój problem był spowodowany brakującymi kolumnami w plikach formatu. Zestaw danych jest dla mnie nowy i pomyślałem, że ma 21 wierszy, podczas gdy w rzeczywistości ma 22 wiersze. To dlatego serwer sql ciągle ładował ostatnie „|” z pliku danych.
Tutaj jest odniesienie dla innych, którzy mogą być zainteresowani ładowaniem pliku danych z systemu UNIX z terminatorami wierszy innymi niż Windows, są trzy metody:
- użyj wstawiania zbiorczego i ustaw terminator wiersza na „0x0a”.
- użyj pliku formatu i ustaw terminator pola ostatniego pola na „\ n „.
- Użyj dynamicznego sql z funkcją Char (10), aby wstawić znak nowego wiersza (LF) do ciągu polecenia, a następnie wykonaj () polecenie.
Przed wypróbowaniem tych metod użyj notatnika, aby wyświetlić wszystkie znaki kontrolne, aby potwierdzić znaki kontrolne używane w plikach tekstowych.
Jeśli żadna z tych metod nie zadziała, możesz mieć inne problemy niż linia terminator kanału / wiersza.