0

我的名为“字典”的数据库有两列名为“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

……

另一个问题已编辑:我可以通过这种技术填充一列,但是当我从第一行填充文本文件中的另一列时。我怎样才能做到这一点 ???

4

2 回答 2

0

假设您的格式文件是正确的,我相信您需要放弃FIELDTERMINATORROWTERMINATOR从您的BULK INSERT

BULK INSERT dictionary
FROM 'C:\Users\jka\Desktop\n.txt'
WITH (FORMATFILE = 'path to my format file.xml') 

还要确保

  1. 输入文件的编码是正确的。在您的情况下,它很可能应该是 ANSI 而不是 UTF-8 或 Unicode。
  2. 行终止符(这是格式文件中的第二个字段终止符)实际上是\r\n而不是\n.

更新由于您需要跳过第一列:

BULK INSERT使用 XML 格式文件,当您使用语句直接导入表时,无法跳过列。为了达到预期的结果并仍然使用 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>
于 2013-02-16T19:24:24.200 回答
0

您的数据文件包含一个字段,因此您的格式文件应反映

<RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r\n"/>
</RECORD>
于 2013-02-16T20:56:35.950 回答