我们目前有一个例程 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
应该在该错误文件中报告问题行。
有任何想法吗?这是一个已知问题吗?我缺少一些参数吗?还有其他方法吗?还是外部数据格式检查器是正确的方法?