【问题标题】:Unable to retrieve specific fields from a text file in bulk insert无法从批量插入的文本文件中检索特定字段
【发布时间】:2015-10-29 09:10:00
【问题描述】:

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

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

没有错误,但问题是文本文件中的整行被插入到表的两列中,但我只想要姓氏和名字。我不确定我做错了什么。我还给出了下表的 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]

【问题讨论】:

  • 对于您将 \n 设置为终止符的 XML 中的两个字段。也许这就是罪魁祸首?如果终止符是换行符,那么整行就是字段的内容。
  • @Paolo 我尝试使用“|”作为终止符,但它给出了错误“在数据文件中遇到了意外的文件结尾”

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


【解决方案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);

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

【讨论】:

  • 试过这个。但收到此错误:消息 4832,级别 16,状态 1,过程 ImportTextFile,第 3 行批量加载:在数据文件中遇到意外的文件结尾。消息 7399,级别 16,状态 1,过程 ImportTextFile,第 3 行链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供商没有提供有关该错误的任何信息。消息 7330,级别 16,状态 2,过程 ImportTextFile,第 3 行无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”获取行。
  • 请查看我对导入参数 LASTROW 和 XML 的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2013-08-12
  • 2018-11-11
相关资源
最近更新 更多