我的名为'dictionary'的数据库有两列名为'column1'和'column2'。两者都可以接受NULL
值。两列的数据类型均为INT
。现在我想使用bcp从文本文件中仅插入column2。我制作了一个格式文件。我的格式文件就像那样
<?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="," MAX_LENGTH="7"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="24"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="column2" xsi:type="SQLINT"/>
</ROW>
</BCPFORMAT>
我的批量陈述就像
BULK INSERT dictionary
FROM 'C:\Users\jka\Desktop\n.txt'
WITH
(
FIELDTERMINATOR = '\n',
ROWTERMINATOR = '\n',
FORMATFILE = 'path to my format file.xml'
)
但它不起作用?我该如何解决这个问题?
N:B: 我的txt文件看起来像
123
456
4101
...
另外一个问题编辑: 我可以通过这种技术填充一个列,但是当我从第一行填充文本文件中的另一列时。我怎么能这样做?
答案 0 :(得分:0)
假设您的格式文件正确无误,我相信您需要放弃FIELDTERMINATOR
ROWTERMINATOR
和BULK INSERT
BULK INSERT dictionary
FROM 'C:\Users\jka\Desktop\n.txt'
WITH (FORMATFILE = 'path to my format file.xml')
同样确保:
\r\n
而不是\n
。更新由于您需要跳过第一列:
使用XML格式文件时,如果使用BULK INSERT
语句直接导入表格,则无法跳过列。为了获得所需的结果并仍然使用XML格式文件,您需要使用OPENROWSET(BULK...)
并在选择列表和目标表中提供明确的列列表。
因此,仅将数据插入column2
使用:
INSERT INTO dictionary(column2)
SELECT column2
FROM OPENROWSET(BULK 'C:\temp\infile1.txt',
FORMATFILE='C:\temp\bulkfmt.xml') as t1;
如果您的数据文件只有一个字段,则您的格式文件可能如下所示
<?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="C1" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="24"/>
</RECORD>
<ROW>
<COLUMN SOURCE="C1" NAME="column2" xsi:type="SQLINT"/>
</ROW>
</BCPFORMAT>
答案 1 :(得分:0)
您的数据文件包含一个字段,因此您的格式文件应该反映出
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r\n"/>
</RECORD>