0

SQL Server でリンク サーバーをセットアップするために使用している ODBC ドライバーのプログラミングの制限により、リンク サーバーへの挿入を処理するためにカーソルを使用する必要があります。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 に設定されます。1 は基本的に、0 が処理されるまでトランザクションをキャッシュに保持するよう ODBC ドライバーに指示します。0 が処理されると、トランザクションはリンク サーバー テーブルにポストされます。

上記の方法を使用する場合、ドライバーは数百行 (通常は 7500 ~ 9000 行を処理する必要があります) を非常にうまく処理しますが、カーソルが一度に 1 つずつレコードを処理しているにもかかわらず、最終的には失敗します。リンクされたテーブルがトランザクションを処理できるよりも速くテーブルに書き込もうとしています。

単純に DELAY 関数を使用する必要がありますか、それともより良い解決策がありますか?

乾杯!マイク

4

1 に答える 1

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
于 2013-09-04T18:12:09.530 に答える