2010-05-13 2 views
0

텍스트 파일 (탭 구분)에서 매일 데이터베이스에 새 레코드를 삽입해야합니다. 데이터를 읽을 파일의 매개 변수가있는 저장 프로 시저로 만들려고합니다.SQL 서버 db에서 txt를 가져 오기위한 저장 프로 시저

CREATE PROCEDURE dbo.UpdateTable 

    @FilePath 

    BULK INSERT TMP_UPTable 
    FROM @FilePath 
    WITH 
    ( 
     FIRSTROW = 2, 
     MAXERRORS = 0, 
     FIELDTERMINATOR = '\t', 
     ROWTERMINATOR = '\n' 
    ) 

    RETURN 

그러면 삽입 할 파일을 지정하는 코드 (C#)에서이 저장 프로 시저를 호출합니다.

이것은 분명히 작동하지 않으므로 어떻게해야합니까?

여기서 명확한 문제는 매개 변수 @FilePathFROM 절에 전달할 수 없거나 최소한 어떻게해야할지 모르겠다는 것입니다.

+0

왜 그런 식으로해야합니까? 당신이 SSIS, BulkCopy 또는 BCP 적어도 사용할 수 있습니다 ... – Incognito

+0

db는 SQL 서버 액세스 권한이없는 여러 사용자에 의해 업데이 트되기 때문에, 그들은 단지 txt 파일을 제공하고 응용 프로그램은 DB에 삽입됩니다 . (임시 테이블에 먼저, 몇 가지 검사하고 마침내 다른 테이블에 추가) – Iulian

+0

좋아,하지만 SSIS를 사용하여 해당 파일을로드하는 데 아무런 문제가 없습니다. 어떻게 든 그 파일들은 어떤 디렉토리로 전달 될 것입니다. 거기에서 파일을로드 할 수 있습니다. 그렇지 않은 경우 자세한 내용을 제공해주십시오. – Incognito

답변

1

죄송합니다. 오해했습니다. 당신의 C# 응용 프로그램에서 파일을 열고 뭔가 더 SQL로 변환 - 나는 늦게 여기입니다 경우

CREATE procedure dbo.UpdateTable 

    @FilePath varchar(max) 
AS 

declare @sql varchar(max) 
declare @parameters varchar(100) 
set @parameters = 'FIRSTROW = 2, MAXERRORS = 0, FIELDTERMINATOR = ''\\t'', ROWTERMINATOR = ''\\n'' ' 
SET @SQL = 'BULK INSERT TMP_UPTable FROM ' + @FilePath + @parameters 

EXEC (@SQL) 

RETURN 
+0

이것은 정확히 내가 찾고있는 것입니다. 지금 다른 종류의 문제가 있다고 생각합니다 : "대량로드에 실패했습니다. 행 1, 열 1에 대한 데이터 파일에서 열이 너무 깁니다. 필드 종결 자와 행 종결자가 올바르게 지정되었는지 확인하십시오." – Iulian

+0

"set @parameters = ..."의 조정이 필요할 수도 있습니다. – simon831

+0

나는 내 텍스트 파일을보고있다. 데이터는 탭 (16 진수 $ 9)으로 구분되지만, 줄 끝 부분에서 나는 똑같은 것을 가지고있다. 구분 기호가 올바르게 이스케이프 처리되지 않았을 수 있습니다. ''\ t ''을 시도했는데 동일한 오류가 발생합니다. – Iulian

0

미안 해요,하지만 난 다른 접근 방식을 제안 : 당신은 그것을 실행 한 후 동적 SQL 문을 작성하고 필요 - 친숙한, DataTable 또는 심지어 XML. C#에서는 파일을 구문 분석하는 방법을 완벽하게 제어 할 수 있습니다. 그런 다음 저장 프로 시저를 작성하여 DataTable 또는 XML을 수락하십시오. DataTable이 좋지만 Entity Framework에서는 사용할 수 없습니다.

이러한 종류의 입력에 참여하여 삽입하는 방법에 대한 도움이 많이 있으며 SQL Server는 집합 작업에 최적화되어 있습니다.