많은 연구 끝에 Microsoft에서 소개 한 대량 삽입 명령을 사용하여 행 순서를 유지할 방법이 없다는 것이 분명해 보입니다. ID 열을 가져 오기 파일에 직접 추가하거나 셸 또는 다른 외부 스크립트를 사용하거나 추가하지 않아도됩니다. 마이크로 소프트가 추가 할 필요가있는 (그리고 쉬운) 기능이 될 것 같지만, 10 년이 넘는 시간이 지나도 아무 것도 일어나지 않을 것입니다.
그러나 가져온 파일에서 가져온 파일의 실제 레코드 순서를 유지해야 할 필요가있었습니다. 상위 레코드가 설정된 열이 동일한 값을 갖는 경우 낮은 레코드 레코드보다 우선합니다.
그래서 나는 다른 경로를갔습니다. 내 제약 조건은 다음과 같습니다.
- 원본 파일을 전혀 변경할 수 없습니다. (나쁜 판례를 설정하십시오!)
- 외부 스크립트를 사용할 수 없습니다. 너무 복잡한. 그것은 간단한 T-SQL 기반 솔루션이었으며, CMD 실행이 필요하지 않았습니다.이것은 자동화 될 수 있도록 단일 절차에 들어갈 필요가있었습니다.
Powershell을 사용하여 각 행에 정렬 된 삽입 문을 작성한 다음 SQL에서 실행하는 논리가 마음에 들었습니다. 기본적으로 BULK 삽입보다는 개별 삽입을 위해 각 레코드를 큐에 넣었습니다. 예, 작동하지만 매우 느립니다. 종종 500K + 행을 가진 파일이 있습니다. 나는 더 빠른 것을 필요로했다.
그래서 저는 XML을 가로 질렀습니다. 파일을 단일 XML 변수로 직접 대량 업로드하십시오. 이것은 각각이 XML에 추가 될 때 레코드의 순서를 유지합니다. 그런 다음 XML 변수를 구문 분석하고 결과를 표에 삽입하여 동시에 식별 컬럼을 추가하십시오.
: 가져 오기 파일은 표준 텍스트 파일이 각 레코드
내 접근 방식 2 단계가있는 줄 바꿈에 (CHAR (10) CHAR (13) +) 끝나는이라고 가정이 있습니다
각 레코드를 XML 태그로 캡슐화하는 (OPENROWSET을 사용하여) IMPORT SQL 문을 실행하십시오. 결과를 XML 변수로 캡처하십시오.
변수를 XML 태그로 테이블에 추가하고 [ID] 열을 추가하십시오.
---------------------------------
Declare @X xml;
---------------------------------
SELECT @X=Cast('<X>'+Replace([BulkColumn],Char(13)+Char(10),'</X><X>')+'</X>' as XML)
FROM OPENROWSET (BULK N'\\FileServer\ImportFolder\ImportFile_20170120.csv',SINGLE_CLOB) T
---------------------------------
SELECT [Record].[X].query('.').value('.','varchar(max)') [Record]
,ROW_NUMBER() OVER (ORDER BY (SELECT 100)) [ID]
--Into #TEMP
FROM @X.nodes('X') [Record](X);
---------------------------------
나는 그래서 파일 이름에 전달하고 1 또는 0 (경우에 머리글 행있다)에서 시작하는 ID를 설정할 수 동적 SQL을 사용하여 내 프로 시저에이를 썼다. 약 5 초 만에 300K 개의 레코드 파일에 대해 실행할 수있었습니다.
SQL 테이블이 본질적으로 순서가 지정되어 있지 않다면 어떤 순서로 삽입 순서가 다른지 자동 증가 열이라고 알 수 있습니까? –