Wkładka zbiorcza z kolumną identity (auto-increment)

Próbuję dodać dane zbiorcze do bazy danych z pliku CSV.

Tabela pracowników ma kolumnę ID (PK) automatycznie inkrementowaną.

CREATE TABLE [dbo].[Employee](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [Name] [varchar](50) NULL,
 [Address] [varchar](50) NULL
) ON [PRIMARY]

Używam tego zapytania:

BULK INSERT Employee  FROM 'path\tempFile.csv ' 
WITH (FIRSTROW = 2,KEEPIDENTITY,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');

.Plik CSV -

Name,Address
name1,addr test 1
name2,addr test 2

Ale to powoduje ten Komunikat o błędzie:

Błąd konwersji danych w zbiorczym ładowaniu (niedopasowanie typu lub nieprawidłowy znak dla podanej strony kodowej) dla wiersza 2, kolumny 1 (id).

Author: Abhi, 2012-06-01

7 answers

Nie wstawiaj bezpośrednio do tabelreal .

I would always

  1. wstaw do tabeli dbo.Employee_Staging (bez kolumny IDENTITY) z pliku CSV
  2. możliwe edytowanie / czyszczenie / manipulowanie importowanymi danymi
  3. A następnie skopiuj dane do rzeczywistej tabeli za pomocą instrukcji T-SQL, takiej jak:

    INSERT INTO dbo.Employee(Name, Address) 
       SELECT Name, Address
       FROM dbo.Employee_Staging
    
 35
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 13:24:02

Dodaj kolumnę id do pliku csv i pozostaw ją pustą:

id,Name,Address
,name1,addr test 1
,name2,addr test 2

Usuń słowo kluczowe KEEPIDENTITY z zapytania:

BULK INSERT Employee  FROM 'path\tempFile.csv ' 
WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');

Pole ID identity zostanie automatycznie inkrementowane.

Jeśli przypiszesz wartości do pola id w pliku csv, będą one ignorowane, chyba że użyjesz słowa kluczowego KEEPIDENTITY, wtedy zostaną użyte zamiast auto-increment.

 85
Author: Josh Werts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 20:41:57

Miałem podobny problem, ale musiałem się upewnić, że kolejność ID jest zgodna z kolejnością w pliku źródłowym. Moim rozwiązaniem jest użycie widoku dla wkładki zbiorczej:

Zachowaj tabelę tak, jak jest i utwórz ten widok (Wybierz wszystko z wyjątkiem kolumny ID)

CREATE VIEW [dbo].[VW_Employee]
AS
SELECT [Name], [Address]
FROM [dbo].[Employee];

Twoja wkładka powinna wyglądać następująco:

BULK INSERT [dbo].[VW_Employee] FROM 'path\tempFile.csv ' 
WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
 22
Author: Paul_S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-25 14:02:27

Musisz wykonać bulk insert z plikiem formatu:

   BULK INSERT Employee FROM 'path\tempFile.csv ' 
   WITH (FORMATFILE = 'path\tempFile.fmt');

Gdzie format pliku (tempFile.fmt) wygląda tak:

11.0
2
1 Sqlchar 0 50 "\T" 2 Nazwa Sql_latin1_general_cp1_ci_as
2 Sqlchar 0 50 "\r\n" 3 adres SQL_Latin1_General_CP1_CI_AS

Więcej szczegółów tutaj - http://msdn.microsoft.com/en-us/library/ms179250.aspx

 6
Author: hotfusion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-27 07:32:10

Moim rozwiązaniem jest dodanie pola ID jako ostatniego pola w tabeli, więc bulk insert ignoruje je i pobiera automatyczne wartości. Czysto i prosto ...

Na przykład, jeśli wstawiamy do tabeli temp:

CREATE TABLE #TempTable 
(field1 varchar(max), field2 varchar(max), ... 
ROW_ID int IDENTITY(1,1) NOT NULL)

Należy pamiętać, że pole ROW_ID musi być zawsze podane jako ostatnie pole!

 2
Author: Langbaba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-04 11:03:25

Inną opcją, jeśli używasz tabel tymczasowych zamiast tabel pośrednich, może być utworzenie tabeli tymczasowej zgodnie z oczekiwaniami importu, a następnie dodanie kolumny tożsamości po imporcie.

Więc twój sql robi coś takiego:

  1. Jeśli tabela temp istnieje, upuść
  2. Utwórz tabelę temp
  3. import zbiorczy do tabeli temp
  4. Alter temp table add identity
  5. tabela Temp kropli

Still not bardzo czyste, ale to inna opcja... być może trzeba będzie założyć zamki, żeby być bezpiecznym.

 0
Author: Izzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 11:54:51

Miałem dokładnie ten sam problem, który spowodował stratę godzin, więc jestem zainspirowany, aby podzielić się moimi odkryciami i rozwiązaniami, które działały dla mnie.

1. Użyj pliku excel

Takie podejście przyjęłam. Zamiast używać pliku csv, użyłem pliku excel (.xlsx) z treścią jak poniżej.

id  username   email                token website

    johndoe   [email protected]        divostar.com
    bobstone  [email protected]        divosays.com

Zauważ, że kolumna id nie ma wartości.

Następnie połącz się z bazą danych za pomocą Microsoft SQL Server Management Studio i kliknij prawym przyciskiem myszy bazę danych i wybierz Importuj dane (podmenu pod zadanie). Wybierz Microsoft Excel jako źródło. Po przejściu do etapu o nazwie "Select Source Tables and Views" kliknij edytuj mappings. W kolumnie id pod destination kliknij na nią i wybierz ignoruj. Nie sprawdzaj Enable Identity insert, chyba że chcesz mantain ID incases, gdzie importujesz dane z innej bazy danych i chcesz zachować auto increment id źródłowego db. Przejdź do końca i to wszystko. Twoje dane zostaną zaimportowane płynnie.

2. Korzystanie z pliku CSV

W pliku csv upewnij się, że Twoje dane są takie jak poniżej.

id,username,email,token,website
,johndoe,[email protected],,divostar.com
,bobstone,[email protected],,divosays.com

Uruchom zapytanie poniżej:

BULK INSERT Metrics FROM 'D:\Data Management\Data\CSV2\Production Data 2004 - 2016.csv '
WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');

Problem z tym podejściem polega na tym, że plik CSV powinien znajdować się na serwerze DB lub w folderze udostępnionym, do którego DB może mieć dostęp, w przeciwnym razie może pojawić się błąd typu "nie można otworzyć pliku. System operacyjny zwrócił kod błędu 21 (urządzenie nie jest gotowe)".

Jeśli łączysz się ze zdalną bazą danych, możesz przesłać swój plik CSV do katalogu na ten serwer i odniesienie do ścieżki w insert luzem.

3. Korzystanie z pliku CSV i opcji importu Microsoft SQL Server Management Studio

Uruchom import danych jak w pierwszym podejściu. Aby uzyskać źródło, wybierz Flat file Source i wyszukaj plik CSV. Upewnij się, że właściwe menu (Ogólne, kolumny, zaawansowane, Podgląd) jest ok. Upewnij się, że ustawiłeś prawy ogranicznik w menu kolumny (ogranicznik kolumn). Podobnie jak w powyższym podejściu excel, kliknij edytuj mappings . W kolumnie id w obszarze destination kliknij na nią i wybierz ignoruj .

/ Align = "left" / Twoje dane zostaną zaimportowane płynnie.
 0
Author: Fokwa Best,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 13:35:01