2009-12-29 9 views
9

Potrzebuję wyeksportować niektóre dane za pomocą narzędzia BCP programu SQL Server 2000. Czasami moje dane zawierają znaki, takie jak \ ti \ n, które muszę używać jako terminatory kolumn i wierszy. W jaki sposób uzyskać BCP, aby uniknąć znaków, które używa jako terminatorów, ponieważ wysyła dane, tak że mogę faktycznie zaimportować dane do innego programu?Uzyskiwanie pliku bcp.exe w celu usuwania terminatorów

Na przykład jedną z moich kolumn są dane tekstowe, a także tabulatory i znaki nowej linii. BCP po prostu eksportuje je tak jak jest, a program, który próbuję zaimportować, zostaje pomieszany, ponieważ dane kończą się w środku linii i/lub linia zawiera dodatkowe kolumny bez wyraźnego powodu.

Wydaje się, że to bardzo, bardzo, bardzo podstawowa funkcja do włączenia do eksportera danych, ale żaden z the command-line options wydaje się o tym wspomnieć. (Dlaczego to nie jest tylko domyślne, jest poza mną.) Czy brakuje mi czegoś?

Odpowiedz

-6

Nie możesz mieć danych zawierających karty i znaki nowej linii za pomocą zakładek i separatorów linii nowej linii. To nie ma sensu. Ucieczka nie pomogłaby, ponieważ zakładka to zakładka. Nie mówimy tutaj o obsłudze ciągów C#.

Co zrobiłbym to użyć different terminators takich jak | i ||/n, lub użyć format file

+1

To naprawdę ma sens - na przykład, używając COPY FROM w PostgreSQL, zamieni sekwencję '\ n' z powrotem na rzeczywisty znak nowej linii w kolumnie tekstowej. I niestety nie mogę określić ogranicznika wiersza w PostgreSQL. – Kev

+0

Ponadto, mimo że różne terminatory to jedno obejście, potrzeba naprawdę krótkiego czasu na zastąpienie zapytania. Byłoby znacznie lepiej, gdyby BCP mógł poprawnie uciec z kolumn tekstowych. – Kev

+0

Ani osql, ani sqlcmd nie obsługują tego. Co jeśli masz pole kończące się na przykład postacią ucieczki? A jeśli czytasz informacje PostgreSQL, wspomina o podejrzanych ucieczkach ... Serwer SQL jest całkowicie przewidywalny, nie? – gbn

-1

mam ten sam problem i szukał długiego czasu, aby znaleźć rozwiązanie. Znalazłem ten jeden z BCP-Master i brzmi rozsądnie. Może chcesz też spróbować.

Możliwe rozwiązanie: http://groups.google.co.uk/group/microsoft.public.sqlserver.tools/tree/browse_frm/thread/f1ee12cba3079189/ef9094123901fe26?rnum=1&q=lindawie+format+file&_done=%2Fgroup%2Fmicrosoft.public.sqlserver.tools%2Fbrowse_frm%2Fthread%2Ff1ee12cba3079189%2Fef9094123901fe26%3Ftvc%3D1%26q%3Dlindawie%2Bformat%2Bfile%26#doc_fa5708ca51d967a6

pliku Format & design: http://msdn.microsoft.com/en-us/library/aa173859%28SQL.80%29.aspx

Ogólnie mogę zaproponować te linki, aby wiedzieć o problemach i rozwiązaniach BCP: http://groups.google.co.uk/groups?q=lindawie+format+file

pozdrawiam

+0

zerwane linki i szczegóły rozwiązania nie opisane w odpowiedzi – wrschneider

5

Całkowicie się z tobą zgadzam: ucieczka powinna być opcją. "Nie możesz mieć danych z kartami lub znakami nowej linii" to najgłupsza rzecz, jaką kiedykolwiek słyszałem.

Oto możliwe rozwiązanie:

  1. użyć opcji -r ustawić inny terminator linii. Coś niezbyt prawdopodobnego w danych (#! # $ #% #). Myślę, że możesz użyć wielu znaków
    , dzięki czemu łatwiej.
  2. Otwórz plik danych w sed, edytorze tekstu, lub napisz skrypt - i zastąp dowolne znaki \ n i \ t ich odpowiednikami z dopasowaniem (\\ n i \\ t). Na koniec zamień terminator linii na \ n i powinieneś być dobry.
  3. myślę to samo powinno mieć zastosowanie do korzystania -t dla terminatorów polowych

Spójrz na this article for more information.

1

Można użyć separatora składa się z wielu znaków, jeśli umieścić je między cudzysłów:

bcp MY_TABLE out C:\MY_FILE.txt -S SERVER_IP -d DB_NAME -U MY_USER -P MY_PASSWORD -w -t "&#)^@" -r ">~+!"

Znaleziono rozwiązanie here.

Powiązane problemy