Sql 大容量插入不识别行终止符

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

我正在准备格式化文件,以便基于将文本限定文件导入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"
"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
  );