使用bcp
软件包中的mssql-tools
(在CentOS 7上)。尝试将TSV文件复制到SQL Server 2012表中并得到错误:
@第1行,第4列:强制转换规范@#
的字符值无效
在vi
中打开tsv,然后使用:set list
来显示制表符分隔符,该记录看起来像...
123456^IJOHN DOE^IJOHN DOE^I26 SEP 96^IM^I1234-2134^IY^IUNIT F^I918 ASDF^IZXCVB^I12^I1342^I12345^I^I1^I^I1234^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I123^I^I^I1234^I^IJOHN DOE^I^I^I^I^I^I^I^I^I^IY^I^I^I^I^I0^I0^I^I0^I^I^I^I^I1234^I^I^I^I SOLUTIONS^I^I^I^I^I^I^I^I123^I^I1^I^I^I^I^I^I^I^I^Iasdf1234^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I^I1234^I^I^I^I^I2019-10-07$
所以我们可以看到第4列是日期字符串文字,格式为dd mon yy
。对我来说,这应该与SQL Server docs
dd mon [,] [yy] yy
(尽管请注意,这是针对SQL Server 2017的,因为我找不到2012年的文档),并确认目标表中的第4列实际上期望使用date
类型。通过查询信息模式
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MYTABLE'
ORDINAL_POSITION COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH IS_NULLABLE
1 ACCOUNT_ID bigint NULL NO
2 ACCOUNT_NAME varchar 160 YES
3 CONTACT_PERSON varchar 410 YES
4 BIRTHDATE date NULL YES
5 SEX varchar 50 YES
...
BCP命令如下:
RECOMMEDED_IMPORT_MODE="-c"
/opt/mssql-tools/bin/bcp "$TABLENAME" in $filename \
-S $DEST_IP \
-U $USER -P $PASSWORD \
-d $DEST_DB \
$RECOMMEDED_IMPORT_MODE \
-t "\t" \
-e $EXPORT_STAGE/$TABLENAME/$TABLENAME.bcperror.log
有人知道这里会发生什么吗?还有其他调试建议吗?