无法从批量插入中的文本文件中检索特定字段

时间:2015-10-29 09:10:01

标签: sql-server xml stored-procedures text-files bulkinsert

我在" |"分隔的文本文件中有以下几行。我只想检索Surname和Firstname并将其写入表格。

input

我创建了XML文件,只检索Surname和firstname:

Released_Date|Label|Type|Id|FormId|Title|Surname|First_Name|Middle_Name
25/07/2014|XCS|CDE|V000011|F000011|Miss|Dālwó|Cabĉver|Ann
25/07/2014|XCS|CDE|V000011|F000011|Miss|Rtyālwó|sabĉper|Joanne

我创建了存储过程来读取它:

<?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="\n"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\n"/>
</RECORD>
<ROW>
 <COLUMN SOURCE="1" NAME="Surname"/>
 <COLUMN SOURCE="2" NAME="First_Name"/>
</ROW>
</BCPFORMAT>

没有错误,但问题是文本文件中的整行被插入到表的两列中,但我只想要Surname和First_Name。我不确定我做错了什么。我还给出了下表中的DDL。请帮忙。

ALTER PROC dbo.ImportTextFile
AS
BULK INSERT test FROM 'C:\Program Files\Data Import.txt'
WITH 
  (
     FIELDTERMINATOR ='|',
     ROWTERMINATOR ='\n',
     FIRSTROW =2,
     FORMATFILE = 'C:\Program Files\cabcolumns.xml'
  );

1 个答案:

答案 0 :(得分:1)

我认为问题出在XML文件的终结符和源列的编号中。

第一个测试可能是快速更新,以更改数据样本上的字段终止符(作为测试,以了解终结符本身是否存在问题)相应地更新所有配置文件。

排除终结器问题,阅读documentation您可以找到有关如何在导入数据时跳过列的示例(请注意提交的ID):

<?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=","/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="8" xsi:type="CharTerm" TERMINATOR=","/>
  <FIELD ID="9" xsi:type="CharTerm" TERMINATOR="\n"/>
</RECORD>
<ROW>
 <COLUMN SOURCE="7" NAME="Surname"/>
 <COLUMN SOURCE="8" NAME="First_Name"/>
</ROW>
</BCPFORMAT>

然后导入:

ALTER PROC dbo.ImportTextFile
AS
BULK INSERT test FROM 'C:\Program Files\Data Import.txt'
WITH (FIRSTROW = 2, FORMATFILE = 'C:\Program Files\cabcolumns.xml', LASTROW = 3);

显式设置最后一行的编号,如果最后一行为空或系统无法正确检测到数据结尾,则可以避免问题。