2013-09-04 2 views
0

SQL Server에서 연결된 서버를 설정하는 데 사용하는 ODBC 드라이버의 프로그래밍 제한으로 인해 ODBC 드라이버가 실패 할 때 커서를 사용하여 연결된 서버에 대한 삽입을 처리해야합니다. 세트 기반 삽입을 시도 할 때. 1 본질적으로 유지하기 위해 ODBC 드라이버를 지시하여, 레코드를 처리커서 처리 속도를 느리게하는 방법

SET NOCOUNT ON 

DECLARE curOutput CURSOR FOR SELECT QTY, QB_ITEM_ID, QB_ID, QB_Flag 
      FROM  dbo.QB_INVOICELINES 
      WHERE  QB_ID IS NOT NULL 
      ORDER BY QB_ID, QB_FLAG DESC, Transaction_Type ASC; 

DECLARE @Quantity DECIMAL(18,2), @ItemID VARCHAR(100), @CustomerID VARCHAR(100), @QBFlag INT; 

OPEN curOutput 

FETCH NEXT 
FROM curOutput 
INTO @Quantity, @ItemID, @CustomerID, @QBFlag; 
--Subroutine for QB insert 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
    INSERT INTO REMOTE...INVOICE_TEST (QB_ID,QB_ITEM_ID,Qty,QB_Flag) 
     VALUES(@CustomerID,@ItemID,@Quantity,@QBFlag) 
    PRINT 'Transaction quantity of ' + CAST(@Quantity AS VARCHAR(12)) + '  for item ID ' + @ItemID + ' for customer ID ' + @CustomerID + ' is now posted.' 

    FETCH NEXT 
    FROM curOutput 
    INTO @Quantity, 
     @ItemID, 
     @CustomerID, 
     @QBFlag; 
END 
--End subroutine for QB insert 
CLOSE  curOutput 
DEALLOCATE curOutput 

의 @QBFlag 중 하나를 1 또는 0으로 설정 :

내가 사용하고 코드는이 다음과 매우 유사 0이 처리 될 때까지 캐시 된 트랜잭션.이 때 트랜잭션은 링크 된 서버 테이블에 게시됩니다.

위의 방법을 사용할 때 드라이버는 수 백 줄 (일반적으로 처리 할 수있는 7500 - 9000 행)에 따라 아주 잘 윙윙 거릴 것입니다. 그러나 커서가 하나의 레코드를 처리 중이지만 궁극적으로 실패 할 것입니다. 연결된 테이블이 트랜잭션을 처리 할 수있는 것보다 빠르게 테이블에 쓰려고 시도하는 시간.

단순히 지연 기능을 사용해야합니까, 아니면 더 좋은 해결책이 있습니까?

건배! 마이크

+1

왜 실패했는지 알아보십시오. – Randy

+2

네, 더 좋은 방법이 있습니다! SSIS를 사용하고 데이터 흐름 작업을 사용하여 한 서버에서 다른 서버로 데이터를 전송하십시오. 이 커서/연결된 서버 접근 방식을 사용하면 둥근 구멍을 통해 사각형 펙을 시도 할 수 있습니다. – GarethD

+1

소스에서 대상으로 데이터를 가져 오는 대신 대상에서 대상으로 데이터를 가져 오지 않는 이유는 무엇입니까? – swasheck

답변

0

커서가 필요하지 않습니다. 다음과 같은 간단한 삽입 쿼리를 사용할 수 있습니다.

insert into REMOTE...INVOICE_TEST 
(QB_ID,QB_ITEM_ID,Qty,QB_Flag) 
SELECT QTY, QB_ITEM_ID, QB_ID, QB_Flag 
FROM dbo.QB_INVOICELINES 
WHERE QB_ID IS NOT NULL 
+1

질문에 ** 설정 기반 삽입을 시도 할 때 ** ODBC 드라이버가 실패한 줄을 놓칠 수 있습니다. ** 주석에서 언급했듯이 실패 이유를 알아내는 것이 현명 할 수 있지만 여전히 그렇지 않습니다. 실제 질문에 답하십시오. – GarethD

+0

위에서 설명한 것처럼이 특정 인스턴스에서는 작동하지 않습니다. – MikeM

관련 문제