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 행)에 따라 아주 잘 윙윙 거릴 것입니다. 그러나 커서가 하나의 레코드를 처리 중이지만 궁극적으로 실패 할 것입니다. 연결된 테이블이 트랜잭션을 처리 할 수있는 것보다 빠르게 테이블에 쓰려고 시도하는 시간.
단순히 지연 기능을 사용해야합니까, 아니면 더 좋은 해결책이 있습니까?
건배! 마이크
왜 실패했는지 알아보십시오. – Randy
네, 더 좋은 방법이 있습니다! SSIS를 사용하고 데이터 흐름 작업을 사용하여 한 서버에서 다른 서버로 데이터를 전송하십시오. 이 커서/연결된 서버 접근 방식을 사용하면 둥근 구멍을 통해 사각형 펙을 시도 할 수 있습니다. – GarethD
소스에서 대상으로 데이터를 가져 오는 대신 대상에서 대상으로 데이터를 가져 오지 않는 이유는 무엇입니까? – swasheck