Sql 大容量插入不识别行终止符
我正在准备格式化文件,以便基于将文本限定文件导入sql server 要导入的数据示例:Sql 大容量插入不识别行终止符,sql,sql-server,import,bcp,Sql,Sql Server,Import,Bcp,我正在准备格式化文件,以便基于将文本限定文件导入sql server 要导入的数据示例: "1000000"|"1100000"|"2017-02-26 00:00:00"|"CAT1"|"Item from CAT1" "1000001"|"1100000"|"2017-02-26 00:00:01"|"CAT2"|"Item from CAT2" "1000002"|"1100001"|"2017-02-26 00:01:02"|"CAT2"|"Item from CAT2" "100000
"1000000"|"1100000"|"2017-02-26 00:00:00"|"CAT1"|"Item from CAT1"
"1000001"|"1100000"|"2017-02-26 00:00:01"|"CAT2"|"Item from CAT2"
"1000002"|"1100001"|"2017-02-26 00:01:02"|"CAT2"|"Item from CAT2"
"1000003"|"1100002"|"2017-02-26 01:02:03"|"CAT3"|"Item from CAT3"
我的格式文件:
13.0
6
1 SQLCHAR 0 0 "\"" 0 FIRST_QUOTE SQL_Latin1_General_CP1_CI_AS
2 SQLINT 0 4 "\"|\"" 1 transaction_id ""
3 SQLINT 1 4 "\"|\"" 2 user_id ""
4 SQLDATETIME 0 8 "\"|\"" 3 create_date ""
5 SQLCHAR 2 10 "\"|\"" 4 category SQL_Latin1_General_CP1_CI_AS
6 SQLCHAR 2 50 "\"\r\n" 5 item SQL_Latin1_General_CP1_CI_AS
其结果是:
批量加载失败。数据文件中第1行第6列的列太长。验证是否正确指定了字段终止符和行终止符
我非常确定该文件包含\r\n(用十六进制编辑器检查显示0x0d,0x0a),尽管忽略了文本限定符和格式文件,我只能用
Bulk insert <table_name> from '\\path\to\file' with (fieldterminator='|', rowterminator='\n')
使用(fieldterminator='|',rowdterminator='\n'从'\\path\大容量插入到\file')
我试着戳了戳你的格式文件,但它证实了我对该格式文件的版本不太在行
不过,切换到xml格式的文件很容易
cat.xml:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR='"' COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='"|"' COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='"|"' COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR='"|"' COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR='"|"' COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR='"\r\n' COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="2" NAME="transaction_id" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="user_id" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="4" NAME="create_date" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="5" NAME="category" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="6" NAME="item" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
结果:
输入文件,在记事本++中显示行终止符:
只需使用
\n
,而不是\r\n
。前者是“回车,换行”(又名CRLF)。后者是“回车、回车、换行”(CRLF)。不过,不确定这是否真的解决了问题。(仅供参考,x0dx0a
是CRLF,因此可能您报告的文件格式不正确,而实际的文件格式没有问题。)如果您已经检查了这一点,很抱歉,但是,项的长度是否有可能超过50?@SqlZim是的,我通过向导导入了它,结果很好。另外,我相当确定另一个数据库中的源字段也是varchar(50)@ps2goat。我不知道\n还包含CR部件。但是,我尝试将最后一个分隔符同时更改为“\”\n”和“\n”(忽略最后一个文本限定符),并得到了相同的错误。您只显示了5列,但错误引用了第六列…如果您向我们提供您所有的信息,这将帮助我们帮助您。这就成功了。因此,可能是格式文件本身的一些格式问题。谢谢。@JagdCrab很高兴提供帮助!您非常聪明,可以使用notepad++来识别rowtermi纳托尔。你是我的英雄!@MustafaErdogan很高兴这有帮助!
bulk insert dbo.cat
from 'c:\cat.txt'
with (
formatfile = 'c:\cat.xml'
, firstrow = 1
);