Problem z Bulk Insert

PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

Cześć ,
Mam problem z masowym importem danych z pliku csv do bazy danych (rekordów ponad 2 miliony)

Kopiuj
Mam tabelkę 'Samochód'  z kolumnami:
SamochodID int not null primary key identity(1,1),,
DataGodzinaZakupu nvarchar(50),
MiejsceZakupu  nvarchar(50),
WojewodztwoZakupu  nvarchar(50),
UszkodzeniaPojazdu  nvarchar(50),
StanPojazdu  nvarchar(50),
CenaPojazdu  nvarchar(50),
RokProdukcji  nvarchar(50)

Wszystkie kolumny są nvarchar

Oraz plik csv Samochod.csv , gdzie w każdej kolumnie znajdują się te informacje:

DataGodzinaZakupu | Miejsce Zakupu|WojewodztwoZakupu |UszkodzeniaPojazdu|StanPojazdu | CenaPojazdu|RokProdukcji
---------------- | -------------------
|12.06.2005 12:45 | Warszawa| Mazowieckie| Uszkodzony Zderzak| Dobry| 5700| 2007
| 17.08.2016 18:32:00| Białystok| Podlaskie| Brak| Dobry| 6570| 2005
| 9.11.2019 10:02:45| Poznań| Wielkopolskie| Uszkodzony tłumik| Dostateczny| 4570| 2001
| 08.07.2018 10:12:00|Opole| Opolskie| Uszkodzony zbiornik paliwa| Dobry| 9874| 2000

Próbuję to załadować Bulk Insertem w ten sposob:

Kopiuj
GO
bulk insert Wypadki
from 'Lokalizacja'
with(
FORMAT='CSV',
FIELDQUOTE = '"',
FIRSTROW=2,
FIELDTERMINATOR=',',
ROWTERMINATOR='\n',
TABLOCK
)
GO

Lecz wywala cały czas błąd
Msg 7301, Level 16, State 2, Line 31 Cannot obtain the required interface ("IID_IColumnsInfo") from OLE DB provider "BULK" for linked server "(null)".

Nie pomogło zamiana Format CSV na DATAFILETYPE = 'char' , nie pomogło też rowterminator na szesnastkowy .

Chcę jeszcze nadmienić iż wolę to zrobić BULK INSERTEM niż SSIS , bo tam też wywala błąd.

Zamiana formatu pliku także nic nie pomaga , formatowanie kolumn na tekstowe także nic nie daje.

PD
  • Rejestracja: dni
  • Ostatnio: dni
PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0
Paweł Dmitruk napisał(a):

pierwszy wynik z google: https://stackoverflow.com/questions/35110998/bulk-insert-4866-and-7301

Usunięcie tabeli SamochódID też nic nie pomogło

PD
  • Rejestracja: dni
  • Ostatnio: dni
0

Bardziej mi chodziło o prawidłowość znaku końca wiersza. Ty ustawiasz jako LF, czy próbowałeś zmienić na CRLF (\r\n), który jest domyślnym końcem wiersza w MS Windows?

PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0
Paweł Dmitruk napisał(a):

Bardziej mi chodziło o prawidłowość znaku końca wiersza. Ty ustawiasz jako LF, czy próbowałeś zmienić na CRLF (\r\n), który jest domyślnym końcem wiersza w MS Windows?

Tak oczywiście próbowałem także i w ten sposób , ale bez skutku

Msg 4832, Level 16, State 1, Line 33 Bulk load: An unexpected end of file was encountered in the data file. Msg 7301, Level 16, State 2, Line 33 Cannot obtain the required interface ("IID_IColumnsInfo") from OLE DB provider "BULK" for linked server "(null)".

Plik jest zapisany jako CSV (rodzielany przecinkami) (*.csv)

PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

Po użyciu tej składni

Kopiuj
Bulk insert Samochód
from 'Lokalizacja'

with(

   FIELDTERMINATOR = '","',
   ROWTERMINATOR = '\n',
    FIRSTROW = 2
);
go

(0 rows affected)

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

Możesz załączyć próbkę tego pliku pierwsze 20 linijek, jako załącznik do posta

PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

Witam,
po 2 miesiącach nieobecności pod tym problemem :) otóż problem znów się pojawił tym razem to powyższej bazy danych chcę wprowadzić dane z csv

Kopiuj
DataGodzinaZakupu;MiejsceZakupu;WojewodztwoZakupu;UszkodzeniaPojazdu;StanPojazdu;CenaPojazdu;RokProdukcji
01.01.2014 00:00;Warszawa;Mazowieckie;Brak;Dobry;7500;2004
04.11.2016 10:40;Poznan;Wielkopolskie;Uszkodzony Blotnik;Dobry;17500;2014
12.11.2018 08:42;Bialystok;Podlaskie;Wybita Szyba;Dostateczny;3800;2004

Próbuję wsadzić te dane do bazy używając bulka w takiej formie:

Kopiuj
bulk insert tabelka
from 'lokalizacja.csv'

 WITH   
      (  FIRSTROW = 2,
         FIELDTERMINATOR =';',  
         ROWTERMINATOR ='/n'  
      );

wywala błąd:

Kopiuj
Msg 4866, Level 16, State 8, Line 36

Struktura tabelki:

Kopiuj
IDauta int not null primary key IDENTITY(1,1),
DataGodzinaZakupu datetime NULL,
MiejsceZakupu nvarchar(150) NULL,
WojewodztwoZakupu nvarchar(150) NULL,
UszkodzeniaPojazdu nvarchar(150) NULL,
StanPojazdu  nvarchar(150) NULL,
CenaPojazdu int null,
RokProdukcji int null
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

Szkoda, że nie wkleiłeś opisu błędu, bo nie bardzo mi pasuje że dopiero w linii 36 się wywala, pierwsze co się rzuca w oczy to to, że uzywasz operacji do dodania danych do tabeli z kolumną identity, a tej kolumny w źródle nie masz... Najprosciej to obejść poprzez stworzenie widoku:

Kopiuj
create view dbo.forbulk_tabelka
as
select 
DataGodzinaZakupu,MiejsceZakupu,WojewodztwoZakupu,UszkodzeniaPojazdu,StanPojazdu,CenaPojazdu,RokProdukcji 
from tabelka

i robić bulk do tego widoku.

druga rzecz to co masz na myśli wstawiając taki: /n ROWTERMINATOR, bo chyba powinno być \n.

Po raz kolejny wstaw próbke faktycznego pliku, bo wklejenie 2 linijek na forum, nie obrazuje znaku końca linii jaki tam faktycznie jest.

PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

Poniżej wklejam próbkę przykładowych danych które za żaden skarb nie idzie wsadzić do tej tabelki ani przez bulk insert ani nawet przez Pythona (strukturę tabeli podałem wyżej). Plik jest zapisany jako csv . Oczywiście danych jest ponad 1, ale wszystkich nie będę wam tutaj wrzucał :D . Ich struktura jest taka sama. Oczywiście FIELDTERMINATOR =';' lub FIELDTERMINATOR =',' nie działa .

https://pastebin.pl/view/embed/3e259043

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

Nie, nie baw się w pastebin weź plik który wrzucasz usuń wszystko poniżej 100 czy 1000 linii spakuj zipem i dodaj do posta jako załącznik. Wtedy będziemy mieć pewność że testujemy to samo.

PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

Oto plik :Auta.7z Problem chyba polega na tym że w źródle nie ma ID, no ale chyba jest identity(1,1) od tego prawda? Nie będe dodawał miliona rekordów z tabelką oznaczającą ID :D

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
2

Problem chyba polega na tym że w źródle nie ma ID, no ale chyba jest identity(1,1) od tego prawda?

Przeczytałes mojego posta gdzie napisałem jak obejść problem z brakiem id w csv?

Taki tsql działa bez problemu:

Kopiuj
set dateformat dmy;
bulk insert forbulk_tabelka
from 'e:\auta.csv'

 WITH   
      (  FIRSTROW = 2,
         FIELDTERMINATOR =';',  
         ROWTERMINATOR ='\n'  
      );
PH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 121
0

@Panczo: Dzięki za ogromną pomoc nie wiem tylko dlaczego wyskakuje mi

Kopiuj
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 21 column 7 (RokProdukcji).
Msg 4864, Level 16, State 1, Line 48
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 30, column 7 (RokProdukcji).
Msg 4864, Level 16, State 1, Line 48

wyskakuje mi ten błąd w kolumnie INT, W momenie kiedy stworzyłem wszystkie kolumny nvarchar wszystko się wgrało lecz gdy zmieniłem na int wyskoczył powyższy błąd. Wszystkie kolumny liczbowe w pliku Auto mają wartości liczbowe bez żadnych ' lub " .

Jak mam kolumny nvarchar wszystko śmiga ale jak mam z int np rok produkcji już nie .

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
0

A co masz w wierszu 21 i 30?

Dodaj CODEPAGE = '65001' do bulka

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.