Problem z terminatorem pola w plikach formatu

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:

  1. użyj wstawiania zbiorczego i ustaw terminator wiersza na „0x0a”.
  2. użyj pliku formatu i ustaw terminator pola ostatniego pola na „\ n „.
  3. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *