2011-11-30 5 views
0

야간 작업으로 한 테이블의 데이터를 새 테이블로 내보낼 수 있습니다.SQL : 데이터를 새 테이블로 내보내고 이전 데이터를 동시에 업데이트하십시오.

dublicate 생성을 방지하기 위해 원본 테이블에서 "ExportState"라는 열을 구현했습니다.이 열은 내보낼 수 없으며 0으로 내보내집니다.

내 문제는 데이터를 내보내고 상태를 1로 설정하고 싶습니다. 그러나 내보내기 중에 원본 테이블에 추가 데이터가 삽입 될 수 있기 때문에 INSERT INTO ... SELECT을 만든 다음 UPDATE 문을 사용할 수 없습니다. 루틴이 실행됩니다. 그래서 결국 대상 테이블에 INSERT 한 레코드에 대해 ExportState를 1로 업데이트합니다.

다음 해결 방법에 대한 제안 사항이 있습니까?

A. INSERT INTO ... SELECT 및 행
B.에 의해 UPDATE ExportState 행은의 스냅 샷 INSERT 더 이해하게 snapshoted 데이터

UPDATE ExportState을 가지고?

두 번째 문제 : 원본 및 대상 테이블이 서로 다른 SQL Server 및 데이터베이스 인스턴스에 있습니다. 아이디어?

답변

0

나는이 작업을 수행하기 위해 저장 프로 시저를 만들 것이다.

저장 프로 시저 내에서 테이블 변수 또는 임시 테이블을 만듭니다. ExportState = 0 인 원본 테이블의 데이터를 임시 테이블에 삽입하십시오. (이 테이블에 기본 키가있는 경우 임시 테이블에 기본 키를 저장하면됩니다.)

원본 테이블에서 대상 테이블로 insert 문을 수행하십시오.

임시 테이블을 사용하여 임시 테이블의 각 레코드에 대해 ExportState = 1을 설정하는 업데이트 문을 수행하십시오.

트랜잭션 내에서이 모든 것을 마무리하십시오.

샘플 코드 :

BEGIN TRAN 

DECLARE @Exported TABLE (PK INTEGER NOT NULL); 
INSERT INTO @Exported (PK) SELECT PK FROM SourceTable WHERE ExportState = 0; 

INSERT INTO @DestinationTable (Field Names) 
SELECT FieldNames 
FROM SourceTable s 
INNER JOIN @Exported e 
ON s.PK = e.PK 
WHERE s.ExportStatus = 0; 

UPDATE s SET ExportStatus=1 
FROM SourceTable s 
INNER JOIN @Exported e 
on s.PK =e.PK; 

COMMIT TRAN 

은 야간 작업에서 저장 프로 시저를 호출합니다.

+0

OK, 고맙습니다. 이것은 goog 아이디어처럼 보입니다. 두 번째 문제 : 원본 및 대상 테이블이 서로 다른 SQL Server 및 데이터베이스 인스턴스에 있습니다. 아이디어? – user1073472

0

다른 SQL Server의 데이터베이스에 연결하려면 연결된 서버를 사용하십시오. SSMS 2008의 "Server Objects"폴더 아래에 하나를 구성 할 수 있어야합니다. 관심이 있으시면 여기에 자세한 정보 링크가 있습니다. ... http://msdn.microsoft.com/en-us/library/ff772782.aspx

관련 문제