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

Unable to retrieve specific fields from a text file in bulk insert

我在一个由“|”分隔的文本文件中有以下几行。我只想检索姓氏和名字并将其写入 table.

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 文件以仅检索姓氏和名字:

<?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>

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

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'
  );

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

CREATE TABLE [dbo].[test](
[Surname] [nvarchar](4000) COLLATE SQL_Latin1_General_CP1253_CI_AI NULL,
[First_Name] [nvarchar](4000) COLLATE SQL_Latin1_General_CP1253_CI_AI NULL
) ON [PRIMARY]

我认为问题出在 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);

明确设置最后一行的编号可以避免最后一行为空或系统无法正确检测数据结尾的问题。