"Copy in failure" SQL 服务器的 BCP 问题(似乎与数据溢出无关)?
"Copy in failure" issue with BCP into SQL Server (seems unrelated to data overflow)?
尝试使用 CentOS 7 上的 mssql-tools
软件包中的 bcp
从 linux 机器中的 TSV 将数据加载到 SQL 服务器数据库中。出现错误:
BCP copy in failure
并且 bcp 生成的错误文件中没有产生错误(使用 -e
选项时)。这让我觉得这是 SQL 服务器数据库端的这个数据集的问题。
注意,我正在使用类似的 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 次写入(而我认为它们应该生成 > 0 次写入以将实际 TSV 数据写入数据库 table(虽然对这些东西不是很有经验,所以真的很 IDK))。
作为参考,我 运行 的 bcp 命令看起来像:
TO_SERVER_ODBCDSN="-D -S MyMSSQLServer"
RECOMMEDED_IMPORT_MODE='-c' # makes a big difference, see
/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)
找到原因:SQL 服务器 table 设计 的设置使得字段不能为空 并且显然导致 bcp 在以下情况下退出尝试插入确实有空值的记录,一旦我设置了 table 设计,以便适当的字段可以为空,bcp 过程按预期完成。
* 请注意我是如何从 bcp 输出或 SQL 跟踪中检测到这个的,所以如果有人有任何更好的调试技巧或我如何更早地发现这个错误,请告诉我。
尝试使用 CentOS 7 上的 mssql-tools
软件包中的 bcp
从 linux 机器中的 TSV 将数据加载到 SQL 服务器数据库中。出现错误:
BCP copy in failure
并且 bcp 生成的错误文件中没有产生错误(使用 -e
选项时)。这让我觉得这是 SQL 服务器数据库端的这个数据集的问题。
注意,我正在使用类似的 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 次写入(而我认为它们应该生成 > 0 次写入以将实际 TSV 数据写入数据库 table(虽然对这些东西不是很有经验,所以真的很 IDK))。
作为参考,我 运行 的 bcp 命令看起来像:
TO_SERVER_ODBCDSN="-D -S MyMSSQLServer"
RECOMMEDED_IMPORT_MODE='-c' # makes a big difference, see
/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)
找到原因:SQL 服务器 table 设计 的设置使得字段不能为空 并且显然导致 bcp 在以下情况下退出尝试插入确实有空值的记录,一旦我设置了 table 设计,以便适当的字段可以为空,bcp 过程按预期完成。
* 请注意我是如何从 bcp 输出或 SQL 跟踪中检测到这个的,所以如果有人有任何更好的调试技巧或我如何更早地发现这个错误,请告诉我。