2011-05-14 2 views
1

는 내가해야 할 것은 테이블에 CSV 파일에서 레코드를 삽입하기 위해 SQL 서버 스크립트를 만드는 것입니다에 파일. 나는 이것이 "BULK Insert"를 사용하여 쉽게 할 수 있다는 것을 알고 있습니다.삽입 기록은 데이터베이스 테이블 (SQL 서버)

BULK 
INSERT TempTable 
FROM 'C:\Records.csv' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 

불행하게도, CSV 파일이 일치하지 않는 규정 (")를 포함 일부 필드 수도 있고 CSV 파일은 아래의 예제처럼 (수동)을 만들 때이 규정이 없을 수 있습니다.

10001,LeBron Quitter,CompanyA 
10002,"Insane, Charlie",CompanyB 
10003,Donald Punk,"CompanyC,CA" 

하는 경우 1. 한정자가 표 (예 : "Insane)에 포함됩니다.
2. 쉼표 (,)는 필드 터미널레이터이므로 두 번째 레코드 4 개의 필드로 간주됩니다.

그래서 전 CSV 파일을 전처리하고 싶지 않기 때문에 다른 것을 생각해야합니다. MICROSOFT.JET.OLEDB.4.0을 사용하여이 솔루션으로 왔습니다.

INSERT INTO MyRealTable 
SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Text;Database=C:\Temp\;','SELECT * FROM [Test.csv]') 

참고 :

EXEC 
sp_configure 'show advanced options', 1 
Reconfigure 
EXEC 
sp_configure 'Ad Hoc Distributed Queries', 1 
Reconfigure 
EXEC 
sp_configure 'OLE Automation Procedures', 1; 
Reconfigure 
EXEC 
sp_configure 'Agent XPs', 1; 
Reconfigure 

질문 :
1. 내 솔루션 올바른 하나입니다 위의 코드는 다음과 같은 액세스 권한/권한을 & 실행이 반드시 실행하기 전에?
2. 다른 더 좋은 해결책이 있습니까?
3. MICROSOFT.JET.OLEDB.4 솔루션을 사용하고 있으므로 설치/필수 사항은 무엇입니까?

는 혼자 SQL 서버에서이 작업을 수행하려고

+0

이 정기적으로 발생 한 시간 삽입 또는 뭔가 :

코드는 다음과 같을까요? – RThomas

+0

데이터베이스 관리자가 대량으로 레코드를 삽입 할 때마다이 완료됩니다. 나는 당신이 "규칙적으로"그것을 부를 수 있다고 생각하지 않습니다 ... 혼란을 가져 주어서 죄송합니다 ... – Vini

답변

1

은 아마 ... 난 그냥 ... 사전에 대단히 감사합니다 자세한 내용을 원하기 때문에 어떤 제안, 비판, 또는 아무것도 매우 열려있어 꽤 어려운 문제입니다. 저는 이것을 별개의 독립 실행 형 콘솔 앱 또는 다른 것으로 가장 좋아합니다.

기본적으로, 나는 CSV 가져 오기를 처리하기 위해 우수한 FileHelpers 2.0 library을 사용하십시오 - 매력처럼 작동하고 사용하기 정말 쉽습니다. 모든 고정 너비 또는 구분 된 파일을 DataTable로 가져올 수 있습니다. 당신이 것을 일단

, 당신은 다음 돌아서 수 있으며, SQL 서버에이를 대량로드에 응용 프로그램에서 SqlBulkCopy를 사용합니다.

// define your input record - what fields are there, how are the rows and 
// fields delimited - the flexibility and power of FileHelpers is amazing! 

[DelimitedRecord(",")] 
public class InputRecord 
{ 
    public int ID; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string PersonName; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string CompanyName; 
} 

// in your console app, grab a file, import it into memory using FileHelpers, 
// then convert it into a DataTable and use SqlBulkCopy to insert it into SQL Server 
static void Main(string[] args) 
{ 
    // grab file name to import from command-line arguments 
    string fileNameToImport = args[0]; 

    // instantiate FileHelpers engine 
    FileHelperEngine engine = new FileHelperEngine(typeof(InputRecord)); 

    // read the data from the file into a DataTable 
    DataTable records = engine.ReadFileAsDT(fileNameToImport); 

    // create your SqlBulkCopy object 
    SqlBulkCopy bc = new SqlBulkCopy("server=(local);database=TEST;Integrated Security=SSPI;"); 

    bc.DestinationTableName = "TempTable"; 

    // bulk copy the data into SQL Server 
    bc.WriteToServer(records); 
} 
+0

thanks marc_s! 하지만 내 마지막 솔루션에서 (참고 : 단지 스크립트를 사용하여이 작업을 실행하는 데 필요한)보고 당신이 충분하다 생각하십니까? – Vini