【问题标题】:Bulk insert not recognizing row terminators批量插入无法识别行终止符
【发布时间】:2017-07-18 09:32:49
【问题描述】:

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

【问题讨论】:

  • 只使用\n,而不是\r\n。前者是'回车,换行'(又名,CRLF)。后者是'回车,回车,换行'(CRCRLF)。不过,不确定这是否真的解决了问题。 (仅供参考,x0dx0a 是 CRLF,所以您报告的文件格式可能不正确,而实际格式没问题?)
  • 对不起,如果您已经检查过,但是,item 的长度是否有可能超过 50?
  • @SqlZim 是的,我通过向导导入了它,并且运行良好。我也相当确定另一个数据库中的源字段也是 varchar(50)
  • @ps2goat 是有道理的。我没有意识到 \n 也包含 CR 部分。但是,我确实尝试将最后一个分隔符更改为 "\"\n" 和 "\n" (忽略最后一个文本限定符),并得到同样的错误。
  • 您只向我们展示了 5 列,但错误引用了第六列...如果您向我们提供您所拥有的所有信息,它会帮助我们帮助您。

标签: sql sql-server import bcp


【解决方案1】:

我试过戳你的格式文件,但它只是证实我对那个版本的格式文件没有任何好处。

不过,切换到 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>

sql:

bulk insert dbo.cat
   from 'c:\cat.txt'
   with (
      formatfile = 'c:\cat.xml'
    , firstrow   = 1
  );

结果:

输入文件,在notepad++中显示行终止符:

【讨论】:

  • 成功了。所以这可能是格式文件本身中一些时髦的格式的问题。谢谢。
  • @JagdCrab 乐于助人!
  • 非常聪明的伙伴可以使用 notepad++ 来识别行终止符。你是我的英雄!
  • @MustafaErdogan 很高兴它有帮助!
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2015-02-04
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2022-01-07
相关资源
最近更新 更多