簡體   English   中英

SQL 服務器存儲過程分解結果

[英]SQL Server stored procedure breaking up results

我正在嘗試從存儲過程中獲取列表,但我相信我可能使用了錯誤的方法?

我得到的數據很好,但是將結果分成幾個部分而不是一個連續的結果。

我需要它是一個連續的結果,因為它需要然后導出到一個會計程序。

SQL 結果

這是我的代碼:

CREATE PROCEDURE [dbo].[billing_generate_invoice]
    @varBillingDealerPeriodID int
AS
    DECLARE @BillingDealerBatchRosterID int;
  
    DECLARE MyCursor CURSOR LOCAL FOR
        SELECT BillingDealerBatchRosterID
        FROM dbo.billing_dealer_batch_roster
        WHERE BillingDealerPeriodID = @varBillingDealerPeriodID;

    OPEN MyCursor;
  
    FETCH NEXT FROM MyCursor INTO @BillingDealerBatchRosterID;

    WHILE @@fetch_status = 0
    BEGIN
        -- START
        SELECT
            COUNT(*) AS ItemTotalCount,
            bdbr.BillingDealerBatchRosterID,
            di.DealerName, 
            -- di.DealerID
            da.ServiceLevelID,
            da.FreshItemFeeID,
            da.WebsiteFeeID,
            da.WebsiteBillingFrequencyID,
            bdbr.BillingDateTo, 
            bdinr.BillingDealerInvoiceNumber
        FROM
            dbo.billing_dealer_batch_item bdbi
        LEFT JOIN   
            dbo.dealer_info di ON di.DealerID = bdbi.DealerID
        LEFT JOIN   
            dbo.dealer_account da ON da.DealerID = di.DealerID
        LEFT JOIN   
            dbo.billing_dealer_batch_roster bdbr ON bdbr.BillingDealerBatchRosterID = bdbi.BillingDealerBatchRosterID
        INNER JOIN  
            dbo.billing_dealer_invoice_number_roster bdinr ON bdinr.DealerID = di.DealerID
        -- LEFT JOIN dbo.lookup__rate_weekly_fee_LR lrwf ON lrwf.ItemQuantity = ItemTotalCount
        -- LEFT OUTER JOIN dbo.billing_dealer_batch bdb ON bdb.DealerID = di.DealerID
        WHERE           
            bdbi.DealerID IN (SELECT DISTINCT DealerID
                              FROM dbo.billing_dealer_batch
                              WHERE DealerID = bdbi.DealerID
                                AND BillingDealerBatchRosterID = @BillingDealerBatchRosterID
                                AND DealerAccountStatusID = 4   -- Dealer Status 4 is ACTIVE only
                             )
            AND bdbi.BillingDealerBatchRosterID = @BillingDealerBatchRosterID -- Roster Week
            AND bdbi.ItemConditionID < 2    -- Less than 2 is AS-IS and Used
        GROUP BY        
            bdinr.BillingDealerInvoiceNumber,
            bdbi.DealerID,
            di.DealerName,
            --   di.DealerID
            bdbr.BillingDateTo,
            da.ServiceLevelID,
            da.FreshItemFeeID,
            da.WebsiteFeeID,
            da.WebsiteBillingFrequencyID,
            bdbr.BillingDealerBatchRosterID
        ORDER BY        
            bdinr.BillingDealerInvoiceNumber;

        -- END 

        FETCH NEXT FROM MyCursor INTO @BillingDealerBatchRosterID;
    END;

CLOSE MyCursor;
DEALLOCATE MyCursor;

如上所述,結果數據正是我需要的,但我得到的意外結果是 4 個部分。

任何幫助將不勝感激!

擺脫 cursor 和循環。

然后改變這個

    AND bdbi.BillingDealerBatchRosterID = @BillingDealerBatchRosterID

對此

    AND bdbi.BillingDealerBatchRosterID IN (
        SELECT DISTINCT BillingDealerBatchRosterID
        FROM dbo.billing_dealer_batch_roster
        WHERE BillingDealerPeriodID = @varBillingDealerPeriodID
    ) 

通過使用 cursor,您只需使用以下代碼。 在這里,您可能需要根據需要更改臨時表的數據類型。

CREATE PROCEDURE [dbo].[billing_generate_invoice]
    @varBillingDealerPeriodID int
AS
BEGIN

IF OBJECT_ID('tempdb..##tmp_billing_generate_invoice', 'U') IS NOT NULL
BEGIN
    DROP TABLE ##tmp_billing_generate_invoice
END

CREATE TABLE ##tmp_billing_generate_invoice
(
   ItemTotalCount INT,
   BillingDealerBatchRosterID INT,
   DealerName VARCHAR(500),
   ServiceLevelID INT,
   FreshItemFeeID INT,
   WebsiteFeeID INT,
   WebsiteBillingFrequencyID INT,
   BillingDateTo DATE,
   BillingDealerInvoiceNumber VARCHAR(500)
)
    DECLARE @BillingDealerBatchRosterID int;
  
    DECLARE MyCursor CURSOR LOCAL FOR
        SELECT BillingDealerBatchRosterID
        FROM dbo.billing_dealer_batch_roster
        WHERE BillingDealerPeriodID = @varBillingDealerPeriodID;

    OPEN MyCursor;
  
    FETCH NEXT FROM MyCursor INTO @BillingDealerBatchRosterID;

    WHILE @@fetch_status = 0
    BEGIN
        -- START
        INSERT INTO ##tmp_billing_generate_invoice(
                                 ItemTotalCount,
                                 BillingDealerBatchRosterID,
                                 DealerName,
                                 ServiceLevelID,
                                 FreshItemFeeID,
                                 WebsiteFeeID,
                                 WebsiteBillingFrequencyID,
                                 BillingDateTo,
                                 BillingDealerInvoiceNumber
                         )
                    SELECT
                        COUNT(*) AS ItemTotalCount,
                        bdbr.BillingDealerBatchRosterID,
                        di.DealerName, 
                        -- di.DealerID
                        da.ServiceLevelID,
                        da.FreshItemFeeID,
                        da.WebsiteFeeID,
                        da.WebsiteBillingFrequencyID,
                        bdbr.BillingDateTo, 
                        bdinr.BillingDealerInvoiceNumber
                    FROM
                        dbo.billing_dealer_batch_item bdbi
                    LEFT JOIN   
                        dbo.dealer_info di ON di.DealerID = bdbi.DealerID
                    LEFT JOIN   
                        dbo.dealer_account da ON da.DealerID = di.DealerID
                    LEFT JOIN   
                        dbo.billing_dealer_batch_roster bdbr ON bdbr.BillingDealerBatchRosterID = bdbi.BillingDealerBatchRosterID
                    INNER JOIN  
                        dbo.billing_dealer_invoice_number_roster bdinr ON bdinr.DealerID = di.DealerID
                    -- LEFT JOIN dbo.lookup__rate_weekly_fee_LR lrwf ON lrwf.ItemQuantity = ItemTotalCount
                    -- LEFT OUTER JOIN dbo.billing_dealer_batch bdb ON bdb.DealerID = di.DealerID
                    WHERE           
                        bdbi.DealerID IN (SELECT DISTINCT DealerID
                                          FROM dbo.billing_dealer_batch
                                          WHERE DealerID = bdbi.DealerID
                                            AND BillingDealerBatchRosterID = @BillingDealerBatchRosterID
                                            AND DealerAccountStatusID = 4   -- Dealer Status 4 is ACTIVE only
                                         )
                        AND bdbi.BillingDealerBatchRosterID = @BillingDealerBatchRosterID -- Roster Week
                        AND bdbi.ItemConditionID < 2    -- Less than 2 is AS-IS and Used
                    GROUP BY        
                        bdinr.BillingDealerInvoiceNumber,
                        bdbi.DealerID,
                        di.DealerName,
                        --   di.DealerID
                        bdbr.BillingDateTo,
                        da.ServiceLevelID,
                        da.FreshItemFeeID,
                        da.WebsiteFeeID,
                        da.WebsiteBillingFrequencyID,
                        bdbr.BillingDealerBatchRosterID
                    ORDER BY        
                        bdinr.BillingDealerInvoiceNumber;

        -- END 

        FETCH NEXT FROM MyCursor INTO @BillingDealerBatchRosterID;
    END;

CLOSE MyCursor;
DEALLOCATE MyCursor;

SELECT * FROM ##tmp_billing_generate_invoice

END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM