【发布时间】:2021-03-31 14:09:27
【问题描述】:
我在使用批量插入时遇到问题。问题是我正在处理的源文件(制表符分隔)包含以cr/lf 结尾的行,而没有用制表符填充其余行的空列的值。因此,当数据被拉入 SQL Server 时,它会将那些缩短的行合并到前一行中。所以基本上它是将多行组合成一个,而不是将它写成两个单独的行,第一行末尾有空值。
说明问题的示例:示例 .txt 文件
column1 column2 column3 column4 column5
1 2 3 4 5
2 5 4 6
4 4 6 4
4 5 6 4 6
SQL 创建表和批量插入
CREATE TABLE test (
[column1] varchar(MAX) NULL,
[column2] varchar(MAX) NULL,
[column3] varchar(MAX) NULL,
[column4] varchar(MAX) NULL,
[column5] varchar(MAX) NULL
)
BULK INSERT test
FROM 'c:\temp\testimport.txt'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\r'
);
真正奇怪的是,我可以使用数据导入向导,它可以完美地导入数据,没有任何问题,并且可以很好地处理列缺少选项卡的问题。但我不知道巫师在幕后做了什么来实现这一点。我很想拥有它用来创建表格并进行插入的代码,因为这可能会回答我的问题。最终我无法使用该向导,因为这最终将成为自动化任务的一部分,我将针对 SQL Server Express 数据库运行多个名称不同但列标题相同的文件。
也许批量插入不是这里的方法?或者有一些明显的东西我错过了,其他人可能知道他们的头脑。无论哪种方式,所有帮助都表示赞赏并提前致谢。
正如 Tim H 所建议的,我已经尝试过创建格式文件来容纳数据。目前的结果如下。
使用
bcp temp.dbo.test format nul -x -f test_format.xml -n -T
生产
<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="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="column1" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="column2" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="column3" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="4" NAME="column4" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="5" NAME="column5" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
按原样使用这个临时文件会产生......
消息 4866,第 16 级,状态 7,第 31 行 批量加载失败。数据文件中第 1 行第 1 列的列太长。请验证是否正确指定了字段终止符和行终止符。
我尝试编辑 XML 以使其正常工作.....
<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="\t" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="column1" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="column2" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="column3" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="4" NAME="column4" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="5" NAME="column5" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
确实插入了数据,但不幸的是仍然会产生相同的混乱插入,并且在同一行中有重叠的行。
【问题讨论】:
-
你可以试试
KEEPNULLS选项吗?另一种选择是使用格式文件,您可以先生成格式文件,然后使用它来导入可能会起作用。 -
已经尝试过KEEPNULLS,结果是一样的。至于格式文件,我读过一点,但没有经验。我只是想如果向导可以完成导入,那么一定有一种干净的方法可以通过查询来完成。
-
您已经标记了 SQL Server 和 MySQL?如果这不是故意的,请删除一个。
-
意外删除,谢谢指出。
标签: sql-server bulkinsert flat-file