2012-05-26 3 views
1

텍스트 파일에서 많은 행의 데이터를 가져 오는 경우가 있습니다. 가져 오기 프로세스는 SqlBulkCopy를 사용하여 수행되고 초기에 스테이징 테이블로로드됩니다.SQL 서버에서 주문

이 데이터에 대해 일부 유효성 검사를 수행하고 유효성 검사가 실패 할 경우 파일의 어느 줄이 잘못되었는지 사용자에게보고 할 수 있기를 바랍니다. 내 스테이징 테이블에서 SELECT의 기본 순서와 함께 ROW_NUMBER()를 사용하기를 원했지만 그렇게 할 수 없다는 제안을받은 somequestions이 있습니다.

입력 파일의 원래 순서를 유지할 수있는 방법으로 무엇을 제안 하시겠습니까? 입력 파일 형식은 TSV입니다. 파일 줄을 가리키는 모의 값을 만들어야합니까?

원래 삽입 순서대로 쿼리 결과를보고 할 수있는 방법이 있습니까? 내가 SqlBulkCopy를 사용하여 날짜를로드하는 것에 의존 할 수 있습니까?

답변

0

파일에 BULK INSERT을 사용하여 원본 테이블 순서를 유지하고 ID를 추가 할 수 있음을 발견했습니다.

을 감안할 때 나는 의도적으로 순서가 행 이동 탭으로 구분 된 테이블, C:\MyTable.txt :

FileName FileType 
wmsetup log 
bar txt 
wmsetup10 log 
WMSysPr9 prx 
WMSysPrx prx 
Wudf01000Inst log 
xpsp1hfm log 
_default pif 
0 log 
002391_ tmp 
005766_ tmp 

을 내가 실행 한 SQL Server의 텍스트 파일 순서를 보존하고 다음과 :

IF EXISTS(
    SELECT 1 
    FROM sys.tables t 
    INNER JOIN sys.schemas s on s.schema_id=t.schema_id 
    WHERE t.name='myTable' 
    AND t.[type]='U' 
    AND s.name='dbo' 
) 
DROP TABLE myTable 
GO 

CREATE TABLE dbo.myTable(FileName VARCHAR(80), FileType VARCHAR(30)) 
GO 

BULK INSERT myTable FROM 'C:\MyTable.txt' WITH (
firstrow=2 
, fieldterminator='\t' 
, rowterminator='\n' 
) 
GO 

ALTER TABLE myTable ADD ID INT IDENTITY(1,1) 
GO 

SELECT * FROM myTable 
GO 

은 결과 :

FileName  FileType ID 
--------------- -------- ----------- 
wmsetup   log  1 
bar    txt  2 
wmsetup10  log  3 
WMSysPr9  prx  4 
WMSysPrx  prx  5 
Wudf01000Inst log  6 
xpsp1hfm  log  7 
_default  pif  8 
0    log  9 
002391_   tmp  10 
005766_   tmp  11 
+0

답장을 보내 주셔서 감사합니다. 지금까지 읽은 모든 것은 이것이 사실이 아니란 것을 암시합니다. [이 SO 게시물] (http://stackoverflow.com/questions/189694/how-to-keep-row-order-with-sqlbulkcopy)는 SqlBulkCopy와 함께 작동하지 않을 것이라고 제안하고 [다른 게시물] (https : //groups.google.com/forum/? fromgroups #! topic/microsoft.public.sqlserver.programming/Bc9HhokagYA). 삽입 순서를 보장하기 위해 수행 할 수있는 방법은 거의 없습니다. 내가 만난 유일한 유망한 점은 http://blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx의 4 번 지점 이었지만 대량 삽입에 도움이되지 않습니다. 감사. –

+1

대량 삽입 + ID가 나를 위해 여기에서했던 것처럼 당신을 위해 작동하지 않는다면, 유일한 나머지 옵션은 대량 삽입 전에 플랫 파일에 직접 RowID 카운터를 삽입하는 쉘 스크립트 일 수 있습니다. Perl은 이런 종류의 일을 쉽게 만듭니다. –

+0

감사합니다. 나는 네가 제안한 것과 똑같이 일을 끝냈다. RowNumber 열을 추가하기 위해 입력을 편집하면서 입력을 편집합니다. 나는 주변을 둘러 쌀 수있는 방법이 있기를 바라고 있었다. 그렇게 말하면서, 자신의 솔루션을 조금 더 조사하면서 가치가 있다고 생각합니다. 그러나 기대했던대로 작동하는지 확인하십시오. 앞서 언급했듯이 대량 파일을 삽입하는 동안 또는 소스 파일에 순서가 정의되어 있지 않으면 SqlBulkCopy를 통해 순서를 유지하는 확실한 방법이있는 것처럼 보입니다. 또한 관련 order by 절이 없으면 선택에 대한 주문을 보장 할 수 없습니다. 다시 한번 감사드립니다. –