Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用格式化文件进行大容量插入_Database_Sql Server 2008_Bulkinsert_Bcp - Fatal编程技术网

Database 使用格式化文件进行大容量插入

Database 使用格式化文件进行大容量插入,database,sql-server-2008,bulkinsert,bcp,Database,Sql Server 2008,Bulkinsert,Bcp,我的名为“dictionary”的数据库有两列,分别为“column1”和“column2”。两者都可以接受空值。两列的数据类型都是INT。现在我只想使用bcp从文本文件插入第2列。我制作了一个格式化文件。我的格式文件是这样的 <?xml version="1.0"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3

我的名为“dictionary”的数据库有两列,分别为“column1”和“column2”。两者都可以接受空值。两列的数据类型都是INT。现在我只想使用bcp从文本文件插入第2列。我制作了一个格式化文件。我的格式文件是这样的

<?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>
但它不起作用?我怎样才能解决这个问题

N:B: 我的txt文件看起来像

123 
456
4101

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

假设您的格式文件是正确的,我相信您需要从批量插入中删除FIELDTERMINATOR和ROWTERMINATOR

批量插入字典 来自“C:\Users\jka\Desktop\n.txt” WITH FORMATFILE='path to my format file.xml' 还要确保:

输入文件的编码正确。在您的情况下,最有可能的是ANSI,而不是UTF-8或Unicode。 行终止符是格式文件中的第二个字段终止符,实际上是\r\n而不是\n。 更新,因为您需要跳过第一列:

对于XML格式的文件,当您使用大容量INSERT语句直接导入到表中时,无法跳过列。为了达到预期的效果,并且仍然使用XML格式的文件,您需要使用OPENROWSETBULK。。。并在选择列表和目标表中提供列的显式列表

因此,要仅将数据插入第2列,请使用:

插入到dictionarycolumn2中 选择第2列 从OPENROWSETBULK'C:\temp\infile1.txt', FORMATFILE='C:\temp\bulkfmt.xml'作为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>

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

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

我没有看到任何VisualStudio或CI假设dictionary是表名而不是数据库名。对吗?是的,Dictionars是表的名称@peterm可能是我的格式文件中的某个错误。但我不明白。@peterm请确保输入文件的编码是正确的。在您的情况下,最有可能的是ANSI,而不是UTF-8或Unicode。行终止符是格式文件中的第二个字段终止符,实际上是\r\n而不是\n。你的格式文件对我来说很好。但是之后,当我想用同样的技术从另一个文本文件中填充这个空值[在第2列]时,它就不起作用了??我该怎么做?@peterm要用另一个文件中的数据更新空值,你需要一种方法将表中的记录与第二个文件中的行关联起来。如果第一个文件和第二个文件中的行数相同,则可以在字典文件中使用标识列,使用标识列将第二个文件导入临时表,连接两个表,并使用临时表中的值更新字典表。最后删除临时表。最好在批量插入之前使用Excel合并这两个文件。这样你就不会有这些问题了。我可以用这种技术填充一列,但是当我像以前一样从第一行填充文本文件中的另一列时。我该怎么做???你为什么问用户2029069和伊蒙一样的问题?这是个错误。那么,你能帮我解决这个问题吗???@Philip如果你有两个独立的文件,每个文件中的项目数量大概相同,请将它们批量插入两个表中,这两个表都有标识列。然后通过连接生成的ID将两个表合并为一个表。
<RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r\n"/>
</RECORD>