由于我们用于在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基本上指示ODBC驱动程序将事务保存在缓存中,直到处理0为止,此时事务将发布到链接服务器表。
当使用上面的方法时,驱动程序会很好地哼唱数百行(通常有7500 - 9000行要处理),但最终会失败,因为我相信即使游标正在处理一个记录时间它仍然试图写入表,而不是链表可以处理事务。
我应该简单地使用DELAY功能还是有更好的解决方案?
干杯! 麦克
答案 0 :(得分: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