T-SQL:BULK INSERT不会产生有用的ERRORFILE

时间:2012-05-31 22:26:28

标签: sql-server bulkinsert

我们目前有一个例行的RUNS DAILY并将数十个平面文本文件导入foxpro。我正在努力将其转换为TSQL。我正在使用BULK INSERT命令。

我为每个平面文件创建了一个sql命令和一个XML文件 - 每个格式一个。

对于每个文件,我从命令行调用这样的翻译:

sqlcmd -d MYDB -i Import_FILEA.sql -o Output_FILEA.txt

效果很好(当它工作时)。问题是数据来自在发送数据之前不验证数据的源。我不怪他们;我知道这些事情会发生什么。但现在我在一个地方。

我的sql脚本如下所示:

SET LANGUAGE us_english;
GO
SET DATEFORMAT ymd;
GO
DELETE FROM [MyDB].[dbo].[FILEA];
GO
BULK INSERT 
  [MyDB].[dbo].[FILEA]
  FROM 'C:\Documents and Settings\somewhere\FILEA.DAT'
  WITH
  (
  DATAFILETYPE ='CHAR',
  FORMATFILE='C:\Documents and Settings\somewhere\translate_FILEA.xml',
  ERRORFILE ='C:\Documents and Settings\somewhere\ERR_FILEA.TXT',
  LASTROW   = 400000
  )
GO

LASTROW参数仅用于调试目的。问题是,当这个东西失败时,它完全失败,并没有告诉我导致问题的行或字段。它不会创建任何错误文件 - 或者如果确实如此,它很快就会丢弃它。 (我可以看到文件被创建然后消失了 - 最糟糕的事情。)

我很喜欢我想写一个perl脚本或者可能用regexp编译vba以查看非字符字段的极少数字段。这是一件小事,但它是额外的 - 我担心下一个人维持它。 (我不认为任何其他人可以在perl中编程或熟悉.net中的regexp)此外,MSDN文档使bulk insert看起来应该报告该错误文件中的问题行

有什么想法吗?这是一个已知的问题吗?有什么参数我不见了?还有另一种方法吗?或者外部数据格式检查器是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

我没有得到错误文件对我有用。我有两个问题的解决方案:

(A)在运行导入之前,创建并运行perl脚本来解析和检查每个平面文件的数据字段。

(B)将所有内容作为文本字段读入,但在每个BULK INSERT之后,通过和UPDATE SET命令设置正确数据类型的额外字段。

我现在正在使用选项(A),因为它首先出现在我身上,因为我可以向数据生产者发送自动电子邮件。