2013-04-30 15 views
6

Próbuję zrzucić bardzo duży zestaw danych z pliku .csv do bazy danych SQL Server 2012. Zamiast robić tysiące INSERTs, badam bcp.BCP nie zwraca błędów, ale także nie kopiuje żadnych wierszy.

EDYTOWANIE: Jest to zautomatyzowany proces, a nie tylko jednorazowy. Też nie mam uprawnień do tej bazy danych: BULK INSERT.

Kiedy próbuję skopiować dane do bazy danych, bcp nie zwraca żadnych błędów, ale również nie kopiuje niczego - po prostu zwraca 0 rows copied. Zmieniłem to na minimalną sprawę, która nie działa.

Najpierw należy utworzyć prostą tabelę z dwoma kolumnami:

CREATE TABLE [dbo].[mincase](
    [key] [varchar](36) NOT NULL, 
    [number] [int] NOT NULL 

    PRIMARY KEY CLUSTERED 
    (
     [key] ASC 
    ) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 40) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

Następnie użyj bcp utworzyć plik formatu z tego. Zauważ, że ten przykład tworzy plik w formacie XML, ale nie ma znaczenia, czy jest to format XML czy natywny.

bcp MyDB.dbo.mincase format nul -T -n -f mincasexml.fmt -x -S .\SQLEXPRESS 

Teraz utwórz plik data.csv z jednym wierszem i dwoma wpisami, rozdzielanymi tabulatorami. W moim przypadku, plik jest po prostu:

somecharacters 12345 

Ponownie, to zakładka, nie dwa miejsca, i to nie wydaje się ważne, czy istnieją końcowe znaki nowej linii, czy nie.

Teraz spróbuj użyć bcp z tego pliku w formacie wstawić dane z tego pliku:

bcp MyDB.dbo.mincase in data.csv -f mincasexml.fmt -T -S .\SQLEXPRESS 

Zamiast kopiowania danych do bazy danych, mam to:

Starting copy... 

0 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total  : 1 

Czy ktoś wie co tu się dzieje?

Dzięki!

+0

wypróbowałeś opcję IMPORT DATA? –

Odpowiedz

8

Komenda bcp zwykle potrzebuje identyfikatora, aby określić tryb formatu pliku bcp.

  • -c określa tryb znaków (zwykły tekst)
  • -n Określa tryb natywny
  • -w Określa tryb Unicode

W twoim przypadku testowego, utworzony plik jest tekstem jawnym, więc powinien wpisać "-c" w twoim bcp w poleceniu.

bcp MyDB.dbo.mincase in data.csv -c -T -S .\SQLEXPRESS 

Microsoft Recommends używając „-n” dla importu i eksportu, aby uniknąć problemów z ograniczników pola pojawiające się w obrębie wartości kolumn (patrz rozdział o trybie tekstowym i rdzennych trybu Dobrych Praktyk).

+1

To było to, z jedną drobną edycją: -f przesłania-c, więc usunięcie pliku formatu całkowicie bardzo starannie rozwiązało problem. Ostateczny wynik to: 'bcp MyDB.dbo.mincase w data.csv -c -T -S. \ SQLEXPRESS' – Mark

+1

Świetne ... poprawianie mojej odpowiedzi. –

1

Wpadłem na podobny problem, z tym, że korzystałem już z pliku formatu, więc dodanie jednej z flag formatu nie pomogło. Dla każdego, kto tutaj kończy, chcę wyjaśnić, co spowodowało ten problem dla mnie (i mam nadzieję, że pomogę wyjaśnić przyczynę problemu).

Problem polega na tym, że BCP faktycznie nie przetwarza linii tekstu w pliku; raczej przetwarza strumień danych zgodnie z instrukcjami, które mu dajesz. Oznacza to, że znaki nowej linii będą ignorowane, jeśli to właśnie (możesz) powiedzieć BCP.

W moim przypadku okazało się, że to literówka w ostatnim wierszu w pliku formatu:

13.0 
1348 
1 SQLCHAR 0 21 "," 1 RecordKey "" 
2 SQLCHAR 0 30 "," 0 SubmissionKey "" 
3 SQLCHAR 0 1 "," 2 A1cLvl "" 
... 
1347 SQLCHAR 0 1 "," 0 WoundIntVac "" 
1348 SQLCHAR 0 1 "/r/n" 0 XClampTm "" 

Jeśli przyjrzeć się bliżej, zobaczysz ukośniki są wstecz w dziedzinie na terminatora ostatnia linia. Zamiast szukania zakończeń linii w stylu Windows, BCP szukało w strumieniu danych ciągu tekstowego "/ r/n".

Ponieważ ciąg nie pojawił się w moich danych, BCP nigdy nie znalazł niczego pasującego do mojego ostatniego pola. Więc ma sens, że znalazł "0 wierszy" do skopiowania.

Nadal nie jestem pewien, dlaczego nie powoduje to czegoś w rodzaju "nieoczekiwanego napotkania EOF" lub czegoś podobnego, ale mam nadzieję, że ktoś inny będzie mógł to rozwinąć.

Powiązane problemy