SET NOCOUNT ON и курсоры - PullRequest
       37

SET NOCOUNT ON и курсоры

1 голос
/ 08 октября 2009

У меня есть сохраненный процесс, который вызывает несколько процедур магазина, каждый из которых вставляет фиктивные данные в одну таблицу. Он работает нормально, за исключением того, что для каждого цикла в курсоре отображается одна строка результатов - просто показывает 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;

Ответы [ 3 ]

4 голосов
/ 08 октября 2009

Вам необходимо направить FETCH в переменную внутри цикла, а также:

WHILE ...
BEGIN
  ...
  FETCH NEXT FROM Clubcard_Cursor INTO @ClubcardID
END
1 голос
/ 08 октября 2009

Ни при каких обстоятельствах я бы не использовал курсор для вставки миллиона строк по одной строке за раз.Это займет несколько часов.Это пример плохого использования курсора.Создайте процесс, который будет выполнять операцию на основе множеств.

0 голосов
/ 08 октября 2009

SET NOCOUNT ON бесполезен внутри извлечения, поэтому удалите его оттуда. Кажется, что lap_CreateClubcardTransaction содержит оператор SELECT внутри своего кода. Можете ли вы проверить, правда ли это?

...