2012-06-28 68 views
0

我正在編寫代碼來每天導入幾十個中等大小的文本文件到SQL SERVER中。目前,這些數據被導入到FOXPRO數據庫中。我正在轉換爲使用SQL SERVER。我已完成所有固定長度的文件,但最後三個數據文件具有可變長度字段作爲每行中的最後一個字段。這個最後的字段可以長達32,000字節。在數據庫中,我已經聲明這是VARCHAR(MAX)。批量插入導入一行,然後終止

字段終止符是換行符,它是換行符。也就是說,該行以單個'0x0a'結束,以標記字段的末尾和行的末尾,而不是兩個換行符。

下面是我使用的SQL:

BULK INSERT 
    [MyDB].[dbo].[X] 
    FROM 'C:\temp\eep.dat' 
    WITH 
    (
    DATAFILETYPE ='CHAR', 
    FORMATFILE='C:\temp\translate_eep.xml', 
    ERRORFILE='C:\temp\ERR_eep.TXT', 
    FIELDTERMINATOR='0X0A', 
    ROWTERMINATOR='0X0A' 
) 
GO 

Translate_eep.xml看起來是這樣的:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharFixed" LENGTH="5"/> 
    <FIELD ID="2" xsi:type="CharFixed" LENGTH="5"/> 
    <FIELD ID="3" xsi:type="CharFixed" LENGTH="5"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="0X0A"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="c1" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="2" NAME="c2" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="3" NAME="c3" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="4" NAME="c4" xsi:type="SQLCHAR"/> 
</ROW> 
</BCPFORMAT> 

不幸的是,當我用這個,它進口一條線,然後終止。我怎樣才能讓這個東西讀取整個文件?

樣本數據:

ABCDE12345EMILYLove is not all. It is not meat, nor drink, nor slumber<lf> 
FGHIJ67890SNL Oh, no! Mr. bill!<lf> 
KLMNO24680ALEX All Nature is but art, unknown to thee<lf> 
PQRST13579FROSTSome say the world will end in fire,<lf> 
+0

您可以發佈樣本數據 – praveen

+0

該錯誤文件中是否有任何內容? – user1166147

+0

Praveen,樣本數據已添加。 user1166147,沒有創建錯誤文件,這意味着(通常)沒有錯誤。 – elbillaf

回答

0

我無法使用解決BULK INSERT這個問題。對於最後的3個表格,那些具有可變長度字段的表格,我使用Perl來用存儲過程上傳數據。它看起來是這樣的:

#!/usr/bin/perl 

use strict; 
use DBI; 

# Open the database 
my ($dbh,$sth); 
my $db_name="MyDB"; 
my $db_instance="AMACHINE"; 

$dbh = DBI->connect("DBI:ODBC:Driver={SQL Server};Server=$db_instance;Database=$db_name;") or die "Unable to connect"; 



my $sql = "DELETE [MyDB].[dbo].[X]" ; 
my $sth = $dbh->prepare($sql); 
$sth->execute(); 

my $sql = "{call MyDB.dbo.Import_X_table(?, ?, ?, ?)}" ; 
my $sth = $dbh->prepare($sql); 

my $in_datafile = "eep.dat"; 
open INF, $in_datafile || die "Unable to open file $in_datafile\n"; 

my $lc = 0; # line counter; 
my $buffer; 
while ($buffer = <INF>) 
{ 
    $lc++; 
    my $reference = substr($buffer, 0, 5); 
    my $code  = substr($buffer, 5, 5); 
    my $name  = substr($buffer, 10, 5); 
    my $narrative = substr($buffer, 15); #everything after character 14 

    $sth->execute($reference, $code, $name, $narrative); 

} 

存儲過程是這樣的:

USE [MyDB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE [dbo].[Import_X_table] 
    @ent  varchar(5), 
    @cd  varchar(5), 
    @nm  varchar(5), 
    @narr  varchar(max) 
AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT INTO [MyDB].[dbo].[X] VALUES (@ent,@cd,@nm, @narr) 
END 

我不喜歡這樣的解決方案,但它是最快捷的工作圍繞我可以拿出。它通過不恰當地規避眼前的問題而不是解決它來達到目的。

我不知道我是否應該接受這個問題作爲解決方案。