Проблема «Копировать при ошибке» с BCP на SQL Server (кажется, не связана с переполнением данных)? - PullRequest
0 голосов
/ 20 сентября 2019

Попытка загрузки данных из TSV на машине linux в базу данных SQL Server с использованием пакета bcp из mssql-tools в CentOS 7. Получение ошибки:

Копирование BCP при ошибке

и в файлах ошибок, генерируемых bcp, ошибок нет (при использовании опции -e).Это заставляет меня думать, что это проблема с этим набором данных на стороне базы данных SQL Server.

Обратите внимание, я использую аналогичную команду BCP для записи данных в ту же базу данных для других наборов данных TSV.

Пример журналов трассировки, которые я вижу для процесса в SQL Server Mgnt Studioпоказано ниже (не уверен, что делать с этими журналами, но, надеюсь, они актуальны)

Audit Login -- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
myuser


SQL:BatchStarting    set quoted_identifier off          myuser          

SQL:BatchCompleted   set quoted_identifier off          myuser

RPC:Completed   exec sp_describe_first_result_set N'select * from NOTE_ENC_INFO'            myuser

RPC:Completed   declare @p1 int
set @p1=1
exec sp_prepare @p1 output,NULL,N'select * from NOTE_ENC_INFO',1
select @p1          myuser

RPC:Completed   exec sp_describe_first_result_set N'select * from NOTE_ENC_INFO'            myuser  

SQL:BatchStarting   insert bulk NOTE_ENC_INFO([NOTE_ID] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[CONTACT_DATE_REAL] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGN_INSTANT_DTTM] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGNUSER_ID] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGN_NOTE_LINK] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGN_REQUIRED_C] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[etl_date] datetime)           myuser

SQL:BatchCompleted  insert bulk NOTE_ENC_INFO([NOTE_ID] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[CONTACT_DATE_REAL] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGN_INSTANT_DTTM] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGNUSER_ID] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGN_NOTE_LINK] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[COSIGN_REQUIRED_C] varchar(254) collate SQL_Latin1_General_CP1_CI_AS,[etl_date] datetime)           myuser      

RPC:Completed   exec sp_unprepare 1         myuser  

Обратите внимание, что в трассировке регистрируется, что события SQL:BatchStarting генерируют 2 чтения, но 0 записей (тогда как Iподумал бы, что они должны генерировать> 0 записей для записи фактических данных TSV в таблицу БД (хотя и не очень разбираются в этом, хотя на самом деле IDK)).

Для справки, команда bcp, которую я выполняювыглядит следующим образом:

TO_SERVER_ODBCDSN="-D -S MyMSSQLServer"
RECOMMEDED_IMPORT_MODE='-c' # makes a big difference, see https://stackoverflow.com/a/16310219/8236733
/opt/mssql-tools/bin/bcp "$TABLE" in "$filename" \
        $TO_SERVER_ODBCDSN \
        -U $USER -P $PASSWORD \
        -d $DB \
        $RECOMMEDED_IMPORT_MODE \
        -t "\t" \
        -e ${filename}.bcperror.log

(Примечание: -D опция: вызывает значение, переданное параметру bcp -S, интерпретироваться как имя источника данных (DSN). "Я использую это для использования / etcФайл /odbc.ini, а не строковый литерал IP. См. https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/connecting-with-bcp?view=sql-server-2017)

1 Ответ

0 голосов
/ 21 сентября 2019

Обнаружил причину: дизайн таблицы SQL Server был задан таким образом, чтобы поля не могли иметь значение null , и, очевидно, приводил к тому, что bcp просто завершал работу при попытке вставить запись, у которой были нулевые значения, после того как я установилдизайн таблицы так, чтобы соответствующие поля могли быть нулевыми, процесс bcp завершен, как и ожидалось.

* Обратите внимание, как я мог бы обнаружить это из вывода bcp или трассировки SQL, поэтому, если у кого-то есть лучшие советы по отладке иликак я мог поймать эту ошибку раньше, пожалуйста, дайте мне знать.

...