2012-03-30 4 views
5
나는 TEMPTABLE에 레코드를 삽입 할

의 많은 양의. 다음과 같이 입력하십시오.INSERT INTO SELECT - 기록

MyTable에 많은 양의 레코드가 포함되어 있으므로 "삽입 위치"가 오래 걸릴 수 있습니다. 내가 실행하려고하면

: 그것은 "을 MyTable"모든 기록 될 때까지 항상 "0"을 반환

SELECT COUNT(*) FROM ##tempT 

명령에 삽입하여 삽입됩니다.

어떻게 ## 유혹에 얼마나 많은 레코드 나 조언을 진행 카운트를 얻을 수 ? SQL 명령이 실행되는 동안

나는 진행률 표시 줄의 값을 업데이트해야합니다.

감사합니다.

+0

호기심에서 왜 임시 테이블에 데이터를 삽입 하시겠습니까? – Baz1nga

답변

8

set transaction isolation level read uncommitted 
SELECT COUNT(*) FROM ##tempT 
+5

좋은 점, 또는 더 나은 여전히 ​​: 연결 상태에 영향을 미치지 않도록'(점심 (*) from ## TempT (nolock)'선택하십시오. – Ben

+0

당신의 시나리오에서'read uncommited'와'nolock' 둘 다 작동 할 것입니다. 그러나 이들은 모두 위험한 무기이기 때문에 데이터 조작 시나리오에서 사용하지 마십시오 (진행 표시 줄은 괜찮습니다). 멋진 – SWeko

+0

는 더 나은 :) – Diego

1

당신은 당신의 쿼리까지 분할 할 수 있습니다보십시오.

x = number of records in MyTable/100 
i = 0 

do until we're done 
    queryString = "insert into ##tempT " 
    queryString += "select top " + x " + " * FROM MyTable " 
    queryString += "where RecordNumber > " + i 

    Execute queryString 
    Update Progress Bar 
    i = i + x 
loop 

이 작업을 수행하려면 일종의 RecordNumber 필드가 필요합니다. 검색 할 수있는 다양한 방법이 있습니다.

+0

벤의 해결책 (Diego의 대답에 대한 의견)은 아마도 당신의 특정 시나리오에 가장 적합 할 것이다. 내 솔루션은 단일 스레드에 국한되어 있고 스레드가 DB 업데이트를 수행하고 우리가 일반적으로 vb6 일 동안 다시해야했던 것처럼 GUI 피드백을 수행 할 때 훨씬 낫습니다. –

+2

이것은 오늘날 표준에 대한 끔찍한 해결책입니다. – JotaBe

+0

@JotaBe 글쎄 지금은 내 감정을 상하게한다. 미안 해요, 제 대답이 당신을 기쁘게하지 못했습니다. –

1

저장 프로 시저를 사용하고 변수 COUNT를 DECLARE하고 루프 변수로 처리하고 삽입이 완료 될 때마다 COUNT를 1 씩 증가시키고 카운트를 알고 싶을 때마다 다른 쿼리를 사용하여 인쇄합니다. 프로 시저의 수를 계산하여 진행률 막대를 업데이트하는 프로그램으로 읽어들입니다. :)

+0

또한 큐에 기록을 유지 한 다음 나중에 TempTable에서 데이터베이스를 업데이트하지 않아도 DB 테이블에 트랜잭션으로 푸시 할 수 있습니다. 성능을 향상시키고 오프라인에서도 수행 할 수 있습니다. – Milee

+0

인서트가 한 번에 완료됩니다. 이 솔루션은 작동하지 않습니다 – Diego

+0

그것은 대기열에 테이블을 삽입하는 것이 아닙니다. – Milee