2009-10-07 118 views
1

我有一个存储过程调用几个存储过程,每个过程将伪数据插入到每个表中。它工作正常,除了在游标中的每一个循环的单行结果显示 - 只显示ClubcardId = 2,ClubcardId = 3等SET NOCOUNT ON和游标

我已经使用SET NOCOUNT ON,但这似乎没有帮助。我正在寻找这个存储过程来创建数百万行,所以SQL打印每行的结果将是一个问题。

任何人都可以请告知如何防止输出显示。我已经复制了下面的父存储过程。我可以确定显示屏不是来自储存proc - lap_CreateClubcardTransaction的子项。

如果我改变:

DECLARE Clubcard_Cursor CURSOR FAST_FORWARD FOR 
SELECT ClubcardId FROM Clubcard 

...到:

DECLARE Clubcard_Cursor CURSOR FAST_FORWARD FOR 
SELECT ClubcardId as 'TEST' FROM Clubcard 

...然后我得到的值 'TEST' 显示光标的每一行。

这里的父存储过程:

ALTER PROCEDURE [dbo].[lap_CreateDummyData] 
AS 
SET NOCOUNT ON 

DECLARE @NumberOfCustomers bigint 
DECLARE @NumberOfTransactions bigint 

SET @NumberOfCustomers = 50000 
SET @NumberOfTransactions = 10 

EXEC lap_CreateCustomer @NumberOfCustomers = @NumberOfCustomers; 
EXEC lap_CreateCustomerPreference @NumberOfCustomers = @NumberOfCustomers; 
EXEC lap_CreateClubCard @NumberOfCustomers = @NumberOfCustomers; 
EXEC lap_CreateClubCardOffer @NumberOfCustomers = @NumberOfCustomers; 

--get static data details to use when creating transaction records 
DECLARE @TransactionType tinyint 
DECLARE @TransactionReasonID tinyint 
DECLARE @TescoStoreID int 
DECLARE @PartnerID bigint 
DECLARE @PartnerOutletID bigint 
DECLARE @ClubcardID bigint 

SET @TransactionType = (SELECT TOP 1 TransactionType FROM TransactionType) 
SET @TransactionReasonID = (SELECT TOP 1 TransactionReasonID FROM TransactionReason) 
SET @TescoStoreID = (SELECT TOP 1 TescoStoreId FROM TescoStore) 
SET @PartnerID = (SELECT TOP 1 PartnerID FROM PartnerOutlet) 
SET @PartnerOutletID = (SELECT TOP 1 PartnerOutletID FROM PartnerOutlet) 

DECLARE Clubcard_Cursor CURSOR FAST_FORWARD FOR 
    SELECT ClubcardId FROM Clubcard 

OPEN Clubcard_Cursor 
FETCH NEXT FROM Clubcard_Cursor 
    INTO @ClubcardID SET NOCOUNT ON 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    EXEC lap_CreateClubcardTransaction @NumberOfTransactions = @NumberOfTransactions, @ClubcardID = @ClubcardID, @TransactionType = @TransactionType, @TransactionReasonID = @TransactionReasonID, @TescoStoreId = @TescoStoreID, @PartnerID = @PartnerID, @PartnerOutletID = @PartnerOutletID; 
    FETCH NEXT FROM Clubcard_Cursor; 
    END; 

CLOSE Clubcard_Cursor; 
DEALLOCATE Clubcard_Cursor; 
+1

并不想成为尖刻(好吧,也许不是太尖刻),但如果你将要使用游标插入数百万行数据,你将遇到比返回数据更大的问题;你可以改写proc的逻辑来设置基础吗?你的服务器会感谢你:) – 2009-10-07 21:30:39

+0

我没有使用基于集合的插入,因为我想要更多地控制我要插入的数据。 – 2009-11-23 17:28:48

回答

4

您需要直接提取到变量循环以及:

WHILE ... 
BEGIN 
    ... 
    FETCH NEXT FROM Clubcard_Cursor INTO @ClubcardID 
END 
+0

它的工作原理,谢谢! – 2009-11-23 17:29:26

0

SET NOCOUNT ON是没用内取出,所以从那里删除它。看来lap_CreateClubcardTransaction在其代码中包含一条SELECT语句。你能检查这是否属实?

1

在任何情况下,我都不会使用游标一次插入一行一百万行。这将需要数小时。这是游标使用不当的一个例子。创建一个将执行基于集合的操作的过程。