如何在使用批量插入时修剪空间?

时间:2015-11-26 15:09:21

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

我使用批量插入来导入rpt文件,但我收到了这些错误:

  

Msg 4866,Level 16,State 1,Line 1
  批量加载失败。第1行第1列的数据文件中的列太长。验证是否正确指定了字段终止符和行终止符。

     

Msg 7399,Level 16,State 1,Line 1
  OLE DB提供程序" BULK"对于链接服务器"(null)"报告错误。提供商没有提供有关错误的任何信息。

     

Msg 7330,Level 16,State 2,Line 1
  无法从OLE DB提供程序中获取行" BULK"对于链接服务器"(null)"。

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

谢谢!

1 个答案:

答案 0 :(得分: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文件的文件格式:

enter image description here