2

我们目前有一个例程 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 脚本或者一些用正则表达式编译的 vba 来检查极少数不是字符字段的字段的事情感到非常恼火。这是一件小事,但它是额外的——我担心下一个人会维护它。(我不认为其他任何人都可以在 perl 中编程或熟悉 .net 中的正则表达式)此外,MSDN 文档看起来bulk insert应该在该错误文件中报告问题行。

有任何想法吗?这是一个已知问题吗?我缺少一些参数吗?还有其他方法吗?还是外部数据格式检查器是正确的方法?

4

1 回答 1

0

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

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

(B) 以文本字段的形式读取所有内容,但在每次 BULK INSERT 之后通过 UPDATE SET 命令设置正确数据类型的额外字段。

我现在选择选项 (A),因为这是我首先想到的,而且我可以自动向数据生产者发送电子邮件。

于 2012-06-06T16:20:06.533 回答