【问题标题】:Bulk insert using format file使用格式文件批量插入
【发布时间】:2013-02-16 19:05:33
【问题描述】:

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

......

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

【问题讨论】:

  • 我没有看到任何 Visual Studio 或 C#
  • 我假设dictionary 是表的名称而不是数据库的名称。对吗?
  • 是的,字典是表的名称@peterm

标签: database sql-server-2008 bulkinsert bcp


【解决方案1】:

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

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

更新因为您需要跳过第一列:

对于 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>

【讨论】:

  • 可能是我的格式文件有问题。但我不明白。@peterm
  • 确保输入文件的编码正确。在您的情况下,它很可能应该是 ANSI 而不是 UTF-8 或 Unicode。行终止符(格式文件中的第二个字段终止符)实际上是 \r\n 而不是 \n。你的格式文件对我来说很好用。
  • 但是在那之后,当我想使用相同的技术从另一个文本文件中填充这个空值[in column2]时,它没有用?我该怎么做??@peterm
  • 稍后要使用另一个文件中的数据更新 NULL 值,您需要一种将表中的记录与第二个文件中的行相关联的方法。如果第一个和第二个文件中的行数相同,那么您可以在dictionary 文件中使用标识列,将第二个文件导入带有标识列的临时表,连接两个表并使用临时表中的值更新字典表。最后删除临时表。
  • 例如使用 Excel 合并 bulk insert 之前的两个文件更好。比你不会有这些问题。
【解决方案2】:

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

<RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r\n"/>
</RECORD>

【讨论】:

  • 我可以通过这种技术填充一个列,但是当我像以前一样从第一行填充文本文件中的另一列时。我该怎么做???
  • 你为什么要问和 user2029069 和 imon 一样的问题?
  • 这是一个错误。那么你能帮我解决这个问题吗?@phil
  • 如果您有两个单独的文件,可能每个文件中的项目数相同,请将它们批量插入到两个表中,这两个表都具有标识列。然后通过加入生成的 id 将两张表合二为一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2012-03-31
相关资源
最近更新 更多