【问题标题】:SET NOCOUNT ON and CursorsSET NOCOUNT ON 和光标
【发布时间】:2009-10-07 20:52:31
【问题描述】:

我有一个存储过程,它调用多个存储过程,每个存储过程都将虚拟数据插入到一个表中。它工作正常,除了为光标中的每个循环显示单行结果 - 仅显示 ClubcardId = 2、ClubcardId = 3 等。

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

谁能告诉我如何防止输出被显示。我已经复制了下面的父存储过程。我可以确定显示不是来自子存储过程 - 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;

【问题讨论】:

  • 不要刻薄(好吧,也许不是太刻薄),但是如果你要使用游标插入几百万行数据,你会遇到比返回的数据;你可以重写要设置的proc的逻辑吗?你的服务器会感谢你的 :)
  • 我没有使用基于集合的插入,因为我想更好地控制要插入的数据。

标签: sql sql-server tsql cursor nocount


【解决方案1】:

您还需要将 FETCH 引导到循环内的变量

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      SET NOCOUNT ON 在 fetch 中是无用的,所以从那里删除它。 lap_CreateClubcardTransaction 似乎在其代码中包含一个 SELECT 语句。你能检查一下这是不是真的吗?

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 1970-01-01
        • 2010-12-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 2013-07-23
        相关资源
        最近更新 更多