BCP nie można zaimportować pustych linii.

18-cze-2013

Próbowałem zrobić wydaje się prostą rzecz. Poprzez bcp wyeksportować dane w postaci czytelnego tekstu do pliku, przenieść plik na drugi serwer i tam go zaimportować.

Zacząłem od przygotowania format file (tutaj bazuję na bazie AdventureWorks2012):

bcp adventureworks2012.HumenResources.Department format null -f c:\temp\format.fmt -T

Kolejny krok to wyeksportowanie danych na jednym serwerze:

bcp AdventureWorks2012.HumanResources.Department out c:\temp\dane.txt -f c:\temp\format.fmt -T

Do tej pory wszystko było OK. (Na potrzeby testu możesz teraz zeskryptować tabelę HumanResources.Department, zmienić nazwę na Department2 i usunąć dla kolumny department ID modyfikator IDENTITY. Możesz także usunąć linijkę constraina PRIMARY KEY lub zmienić jego nazwę dopisując np „2”)

Teraz decydujący moment. Importujemy dane:

bcp AdventureWorks2012.HumanResources.Department2 in c:\temp\dane.txt -f c:\temp\format.fmt -T

A tu niespodzianka (najważniejsze fragmenty błędów poniżej

C:\Users\Rafal>bcp AdventureWorks2008r2.HumanResources.Department in c:\temp\a.t xt -T  -f Department-c.fmt

Starting copy… SQLState = 23000, NativeError = 515 Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Cannot insert the value NULL into column 'GroupName’, table 'AdventureWorks2008R2.HumanResources.D epartment’; column does not allow nulls. INSERT fails. SQLState = 01000, NativeError = 3621 Warning = [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement ha s been terminated.

Jak to! Do jasnej choinki! Eksportowałem tym samym porgamem, tym samym programem importuję i klapa!

Oto przyczyna:

http://connect.microsoft.com/SQLServer/feedback/details/687332/bcp-out-throws-error-when-null-values-are-there-in-the-table

bcp w wersji 2008, a na takiej pracowałem się… zepsuło. Eksport do pliku dodawał nową pustą linię. Import czytał tę linię, nic tam nie znajdował, więc konwertował dane na null i się wysypywał. Przed importem trzeba by usunąć znak pustej linii, lub policzyć ilość wierszy i nie importować ostatniejgo wiersza (umożliwia opcja -L). Na szczęście chłopaki z MS poprawili usterkę i w 2012 działa już dobrze.

To pokazuje również, że CONNECT do zgłaszania usterek w oprogramowaniu Microsoft działa. Brawo!

Komentarze:

  1. Mobilo » Blog Archive » Pobieranie danych z pliku tekstowego napisał,

    […] do SQL Server z plików tekstowych. W poniższych przykłądach wykorzystuję plik format file. Tutaj znajdziesz informację, jak go […]

Autor: Rafał Kraik