使用格式文件批量插入

时间:2013-02-16 19:05:34

标签: database sql-server-2008 bulkinsert bcp

我的名为'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

...

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

2 个答案:

答案 0 :(得分:0)

假设您的格式文件正确无误,我相信您需要放弃FIELDTERMINATOR

中的ROWTERMINATORBULK 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
  3. 更新由于您需要跳过第一列:

    使用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>
相关问题