SQL批量插入错误,因为最后一个字段包含回车符

时间:2016-09-15 19:27:17

标签: sql sql-server bulkinsert carriage-return

提前感谢您的帮助。

我正在尝试将平面文件导入我的SQL服务器数据库。我收到截断错误。我(我认为)的问题是文件的最后一个字段是一个自由格式文本字段,它似乎允许在字段内回车。所以我最终将{CR} {LF}作为行终结符,但有时{CR} {LF}实际上只是最后一个字段中自由格式文本中的新行。

有没有人知道如何加载这些数据?谢谢你的帮助。

这是我的代码:

DROP TABLE   #SHELL
CREATE TABLE #SHELL
(
Field1 varchar(50)
,Field2 varchar(50)
,Field3 varchar(50)
,Field4 varchar(50)
,Field5 varchar(50)
,Field6 varchar(160)
,Field7 varchar(50)
,Field8 varchar(50)
,COMMENTS nvarchar(MAX)
 )

BULK INSERT #SHELL
FROM 
'[thefilepath].txt'
WITH
(
FIRSTROW = 1,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
)

这是在Notepad ++中查看的表格图片,因此您可以看到回车符和换行符。

Table Sample

3 个答案:

答案 0 :(得分:1)

您的图片没有通过,但是当导出或文件来自LINUX系统时,您通常需要使用HEX。试试这个:

WITH (FIELDTERMINATOR = '\t',FIRSTROW=1,ROWTERMINATOR = '0x0a')

答案 1 :(得分:1)

如果您想对此进行审议,我会预处理文本文件以删除那些“中间字段”行终止符,或者,如果它们很重要,则替换另一个转义字符。

例如,创建一个脚本,该脚本接收文件中的每一行并尝试将其拆分到列分隔符上,并比较您获取的令牌数 - 以确定一行是否真的是包含所有预期列的完整行。

对于任何比预期更少的标记行,将它与前一行合并,可选择将转义字符插入最后一列。

将结果写入新文件,因此每条DB记录都是一行。

导入后,可以选择使用update语句将行终止符放回最后一个字段。例如,如果你用一个|代替它们然后更新以替换|在SQL中使用\ n。

示例:文件中的“记录”可能是:

value value1 value2 some long text
wraps to another line and
yet another line
value value1 value2 a better behaved record on one line

这是两条记录,但有四条线。在预处理文件时,请将其设为:

value value1 value2 some long text|wraps to another line and|yet another line
value value1 value2 a better behaved record on one line

然后记录实际上是文件中每行一个,每个CRLF是一行的结尾和记录的结尾。批量导入有效,但最后一列的值为

some long text|wraps to another line and|yet another line

执行更新替换|通过SQL中的CRLF返回到文件中的内容的准确表示

答案 2 :(得分:0)

单独批量插入无法真正解决这个问题。所以,有两种选择:

  1. 预处理文件,以便每条记录只在一行上。基本上,您需要用其他字符/字符串替换每个中间字段CRLF。
  2. 将文件加载到单个数据列的临时表中,然后使用SQL组合中间字段CRLF并最终到达最终表。注意:SQL通常非常糟糕(拆分字符串等),你可以使用一些库来帮助,但就个人而言,我试图避免这种解决方案。