SQL 服务器存储过程分解结果

SQL Server stored procedure breaking up results

我正在尝试从存储过程中获取列表,但我认为我可能使用了错误的方法?

我取回的数据很好,但将结果分成多个部分而不是一个连续的结果。

我需要它是一个连续的结果,因为它需要然后导出到会计程序。

更新

我可能应该提到我正在自学SQL和程序,所以我并不完全知道我在做什么,所以请原谅我。 :)

我上周大部分时间都在写作和重写,最后才来这里寻求帮助。

我现在意识到我写的东西过于复杂(更不用说没有按照我需要的方式给出响应。)我试图重新利用我在别处找到的代码。

这是我更正后的代码。

    @varBillingDealerPeriodID int

AS

DECLARE @BillingDealerBatchRosterID int;

    BEGIN TRY

        SELECT  count( * ) AS ItemTotalCount
                , di.DealerName
                , di.DealerID
                , 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.billing_dealer_batch_roster bdbr            ON bdbr.BillingDealerBatchRosterID = bdbi.BillingDealerBatchRosterID
            LEFT JOIN   dbo.billing_dealer_invoice_number_roster bdinr  ON bdinr.DealerID = di.DealerID

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

        GROUP BY di.DealerName
                , di.DealerID
                , bdbr.BillingDateTo
                , bdinr.BillingDealerInvoiceNumber
    END TRY 

感谢大家的帮助!

摆脱光标和循环。

然后改变这个

    AND bdbi.BillingDealerBatchRosterID = @BillingDealerBatchRosterID

对此

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

通过使用光标,您可以只使用以下代码。在这里,您可能需要根据需要更改临时 table 的数据类型。

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