我有一个平面文件,我想将其批量插入SQL服务器(2016)。
BULK INSERT table FROM 'path\flatfile.dat'
WITH
(
FORMATFILE='path\fileformat.fmt',
CODEPAGE = '65001',
DATAFILETYPE = 'Char'
);
平面文件没有字段终止符:
9999030000000001001ab Baujahr 0
9999030000000001004from construction year 0
9999030000000001006à partir d'année de construction 0
9999030000000001007da anno 0
9999030000000001008año construcción desde 0
9999030000000001009Vanaf bouwjaar 0
9999030000000001010fra byggeår 0
9999030000000001011från årsmodell 0
9999030000000001012fra årsmodell 0
9999030000000001013Vuosimallista 0
但在格式文件中我设置了字段的长度
12.0
7
1 SQLCHAR 0 22 "" 1 Field1 ""
2 SQLCHAR 0 4 "" 2 field2 ""
3 SQLCHAR 0 3 "" 3 field3 ""
4 SQLCHAR 0 9 "" 4 field4 ""
5 SQLCHAR 0 3 "" 5 field ""
6 SQLCHAR 0 60 "" 6 Textfield ""
7 SQLCHAR 0 1 "\r\n" 7 flag ""
除了这个以外,我使用类似格式的其他文件效果很好。 我得到的错误是截断行,其中包含caractersáåóñ...
Msg 4863, Level 16, State 1, Line 6
Bulk load data conversion error (truncation) for row 3, column 7 (LFlag).
Msg 4863, Level 16, State 1, Line 6
Bulk load data conversion error (truncation) for row 5, column 7 (LFlag).
Msg 4863, Level 16, State 1, Line 6
Bulk load data conversion error (truncation) for row 7, column 7 (LFlag).
Msg 4863, Level 16, State 1, Line 6
任何想法?
答案 0 :(得分:0)
目前还不清楚BCP在使用UTF-8时是否完全支持使用格式文件 - 您的经验表明它并非如此。 导入UTF-8文件时,字节数和字符数之间似乎存在一些混淆。我认为这可能是BCP中的一个错误。
使用以下测试表
USE tempdb
GO
CREATE table t1
(f1 nvarchar(max),
f2 nvarchar(max),
f3 nvarchar(max),
f4 nvarchar(max),
f5 nvarchar(max),
f6 nvarchar(max),
f7 nvarchar(max))
我能够使用问题中的格式文件和相同的BULK INSERT
命令导入您的文件。
然而,值得注意的是,最后一列(我的表中的f7
)是左边填充的,其中一些前导空格等于第6列中的双字节数字。/ p>
在第3行(第6列值à partir d'année de construction
)上,第7列用两个空格填充。第5行和第8行也是如此,它们也有两个双字节字符。
在第9行(第6列值fra årsmodell
)上,第7列用一个空格填充。第7行也是如此。
看起来BCP没有正确跟踪字节数和字符数。
假设输入文件的格式是固定的,我可以看到解决此问题的唯一选择是将数据文件导入到包含单个nvarchar(max)
列的表中,然后使用LEFT
,RIGHT
和SUBSTRING
语句从行中提取数据值:
CREATE TABLE t2
(f1 nvarchar(max))
BULK INSERT t2 FROM 'file\location' WITH (CODEPAGE = '65001',DATAFILETYPE = 'Char' );
SELECT LEFT(f1,22), SUBSTRING(f1,23,4), SUBSTRING(f1,27,3),
SUBSTRING(f1,30,9), SUBSTRING(f1,39,3), SUBSTRING(f1,42,60),
SUBSTRING(f1,102,1)
FROM t2
修改强>
测试了一种XML格式文件,该文件也无法正常工作。尽管使用XML格式文件允许加载文件而不会出错,但第7列的值将丢失并替换为空格。
格式文件:
<?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="CharFixed" LENGTH="22"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="4"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="3"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="9"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="3"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="60"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="1"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR="\r\n" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="C1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="C2" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="C3" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="C4" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="C5" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="C6" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="C7" xsi:type="SQLCHAR" />
</ROW>
</BCPFORMAT>
(BULK INSERT
命令与问题中的命令相同,但格式文件名除外。)