【问题标题】:How to trim spaces when using a bulk insert?使用批量插入时如何修剪空格?
【发布时间】:2016-02-29 17:43:22
【问题描述】:

我正在使用批量插入导入 rpt 文件,但出现以下错误:

消息 4866,第 16 级,状态 1,第 1 行
批量加载失败。数据文件中第 1 行第 1 列的列太长。请验证是否正确指定了字段终止符和行终止符。

消息 7399,第 16 层,状态 1,第 1 行
链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供者没有提供有关错误的任何信息。

消息 7330,第 16 级,状态 2,第 1 行
无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行。

我认为这是由于文件列之间的空格,有什么办法可以修剪这些空格?

谢谢!

【问题讨论】:

  • 我认为 rpt 代表报告输出文件,此输出看起来像固定宽度数据或系统数据格式 (SDF) 数据。您是否有机会使用 C# 来完成这项工作?使用 C#(或任何其他语言)很容易从第一行解析列名,并从第二行的破折号确定宽度以生成可用于将数据插入 SQL 服务器的数据表或读取器(可能使用 SqlBulkCopy班级)。我从来没有发现 SQL Server 本身在导入文本文件时很直观。

标签: sql sql-server sql-server-2008-r2 bulkinsert


【解决方案1】:

如果你的文件中只有空格,你的文件格式是固定的,你需要一个格式文件来加载它。

SELECT *
  FROM  OPENROWSET(BULK  'C:\Users\Admin\Desktop\Extractions\F0005.rpt',
  FORMATFILE='C:\myTestSkipField.fmt'  
   ) AS t1;

我在下面包含了一个示例 .fmt 文件,它使用 EmptyField 列映射空间来映射文件中的前几个字段。你可以省略这个,因为看起来你无论如何都必须使用LTRIM(TRIM([column])) 来修剪你的字段

9.0
8
1     SQLCHAR     0     4     ""      1     DRSY        SQL_Latin1_General_CP1_CI_AS
2     SQLCHAR     0     1     ""      2     Empty1      SQL_Latin1_General_CP1_CI_AS
3     SQLCHAR     0     4     ""      3     DRTT        SQL_Latin1_General_CP1_CI_AS
4     SQLCHAR     0     10     ""     4     DRKY        SQL_Latin1_General_CP1_CI_AS
5     SQLCHAR     0     1     ""      5     Empty2      SQL_Latin1_General_CP1_CI_AS  
6     SQLCHAR     0     30     ""     6     DRDL01      SQL_Latin1_General_CP1_CI_AS
7     SQLCHAR     0     1     ""      7     Empty3      SQL_Latin1_General_CP1_CI_AS
8     SQLCHAR     0     1024    "\n"  8     Remainder   SQL_Latin1_General_CP1_CI_AS

来自 Microsoft documentation,这是 .fmt 文件的文件格式:

【讨论】:

  • 我会尝试重现该问题。您的.rpt 文件制表符是分隔的还是管道分隔的?
  • myTestSkipField.fmt 应该包含什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2015-09-12
  • 2012-09-28
相关资源
最近更新 更多