Problem z Bulk Insert

0

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

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 1800| Białystok| Podlaskie| Brak| Dobry| 6570| 2005
| 9.11.2019 1045| Poznań| Wielkopolskie| Uszkodzony tłumik| Dostateczny| 4570| 2001
| 08.07.2018 1000|Opole| Opolskie| Uszkodzony zbiornik paliwa| Dobry| 9874| 2000

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

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.

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

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?

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)

0

Po użyciu tej składni

Bulk insert Samochód
from 'Lokalizacja'

with(

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

(0 rows affected)

0

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

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

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:

bulk insert tabelka
from 'lokalizacja.csv'

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

wywala błąd:

Msg 4866, Level 16, State 8, Line 36

Struktura tabelki:

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
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:

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.

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

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.

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

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:

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

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

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

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 .

0

A co masz w wierszu 21 i 30?

Dodaj CODEPAGE = '65001' do bulka

1 użytkowników online, w tym zalogowanych: 0, gości: 1