2012-05-31 50 views
2

我們目前有一個常規RUNS DAILY並將數十個平面文本文件導入到foxpro中。我正在努力將其轉換爲TSQL。我正在使用BULK INSERT命令。T-SQL:BULK INSERT不會產生有用的ERRORFILE

我爲幾十個平面文件中的每一個創建了一個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應該報告錯誤文件中的問題行。

任何想法?這是一個已知的問題嗎?有一些參數我錯過了嗎?有沒有其他的方法呢?或者是外部數據格式檢查器的正確方法?

回答

0

我還沒有收到錯誤文件對我有用。我有兩個解決方案:

(A)在運行導入之前,創建並運行一個perl腳本來解析和檢查每個平面文件的數據字段。 (B)作爲文本字段讀入所有內容,但在每個BULK INSERT之後通過和UPDATE SET命令設置正確數據類型的額外字段。

我現在正在選擇(A),因爲它首先發生在我身上,因爲我可以自動發送電子郵件給數據生產者。