1

複数のストア プロシージャを呼び出すストアド プロシージャがあり、それぞれがダミー データをそれぞれ 1 つのテーブルに挿入します。カーソル内のループごとに 1 行の結果が表示されることを除いて、正常に動作します - 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;
4

3 に答える 3

4

ループの変数にも FETCH を指示する必要があります。

WHILE ...
BEGIN
  ...
  FETCH NEXT FROM Clubcard_Cursor INTO @ClubcardID
END
于 2009-10-07T21:28:58.323 に答える
1

いかなる場合でも、カーソルを使用して一度に 1 行ずつ 100 万行を挿入することはありません。それには何時間もかかります。これは、カーソルの不適切な使用例です。セットベースの操作を行うプロシージャを作成します。

于 2009-10-07T21:27:43.843 に答える
0

SET NOCOUNT ONフェッチ内では役に立たないので、そこから削除してください。lap_CreateClubcardTransaction のコード内に SELECT ステートメントが含まれているようです。これが本当かどうか確認できますか?

于 2009-10-07T20:58:05.980 に答える