【问题标题】:bulk insert skip last row批量插入跳过最后一行
【发布时间】:2014-09-16 18:56:10
【问题描述】:

我正在进行批量插入,我必须跳过最后一行。否则,我收到一条错误消息“批量插入:数据文件中遇到意外的文件结尾 (EOF)”。 如果我设置 ROWTERMINATOR='\r\n',那么我导入了 0 行。

我想知道是否有任何代码可以帮助我跳过 txt 文件的最后一行? (最后一行是动态的。)我的公司目前没有安装 SSIS。

我的批量插入代码是

Declare @SQL1 varchar(150), @path varchar(100), 

@pathtable varchar(100), @date datetime

set @date = getdate()


-- set path for files

set @path= 'C:\imp\'

set @pathtable = @path + 'importfile.txt'



delete from IDX

--  set sql

set @SQL1 = "BULK INSERT dbo.table FROM '" + @pathtable 

+ "' WITH (FIRSTROW = 2, MAXERRORS = 0)"


-- Bulk insert

exec(@sql1)

【问题讨论】:

  • 你可以使用格式文件,msdn.microsoft.com/en-gb/library/ms178129.aspx
  • 感谢您提到这一点,但这是否有助于我跳过最后一行?
  • 是的,您可以使用格式文件提及要读取的字段数。
  • 我想包含除最后一行之外的所有字段(列)。我不认为格式文件可以做到这一点?
  • 如果您事先知道字段的数量并且它是固定的,那么格式化文件的工作方式需要其他方式

标签: sql sql-server


【解决方案1】:

问题是最后一行包含导出过程中的行数。如果您能够修改导出过程,请确保使用 SQL 命令:

SET NOCOUNT ON;

如果您使用 GUI 导出数据,则应该有一个地方可以修改使用的 T-SQL 或设置 nocount 的选项。

这将防止最后一行写入您的文件。

如果您无法修改导出过程...您可能会发疯并正确使用控制台应用程序来读取数据并删除最后一行,或者使用基本上完成该任务的 CLR.. 打开文件,删除最后一行行,保存文件,然后调用上面的存储过程来批量插入数据。

【讨论】:

    【解决方案2】:

    您需要多次使用单引号',您已经使用了双引号",它们在sql server中被视为标识符。

    您的查询应如下所示...

    Declare @SQL1 varchar(150)
          , @path varchar(100)
          , @pathtable varchar(100)
          , @date datetime
    
    SET @date = getdate();
    
    SET @path= 'C:\imp\'
    SET @pathtable = @path + 'importfile.txt'
    
    
    SET @SQL1 = 'BULK INSERT dbo.table 
                 FROM ''' + @pathtable + ''' 
                 WITH ( 
                         FIRSTROW  = 2
                       , MAXERRORS = 0
                       )';
    

    现在,如果你打印这条 SQL 语句,它会看起来像这样......

    PRINT @SQL1
    
    RESULT:
    
    BULK INSERT dbo.table 
                 FROM 'C:\imp\importfile.txt' 
                 WITH ( 
                         FIRSTROW  = 2
                       , MAXERRORS = 0
                       )
    

    【讨论】:

    • 谢谢提醒,我原来也设置了 SET QUOTED_IDENTIFIER OFF
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多