首页 > 解决方案 > 操作存储过程中的数据列表以在另一个存储过程中使用

问题描述

目前我正在使用 SQL Server 中的 T-SQL 编写存储过程。我的脚本包含运行另一个存储过程以从表中获取数据列表的代码。我想操作数据,使用数据列表从存储过程中修改它们以用于另一个目的(例如总结一列并添加更多数据列表)。我知道的一种方法是创建一个临时表。但在那之后,我不太确定。请帮忙。谢谢。

这是我的代码:

ALTER PROCEDURE [dbo].[AJU_Rpt_ARAgingSp]
    (@Slsman_Starting slsmantype = NULL,
     @Slsman_Ending slsmantype = NULL,
     @Custnum_Starting custnumtype = NULL,
     @Custnum_Ending custnumtype = NULL,
     @CustType endusertypetype = NULL,
     @CutOff_Date datetype = NULL,
     @SumToCorp ListYesNoType = NULL, -- >> 0 = individual, 1 = corp customer
     @ShowActive ListYesNoType = NULL, -- >> 0 = all trx, 1 = active only
     @TransDomCurr ListYesNoType = NULL, -- >> 0 = dont convert, 1 = convert to local currency
     @AgingBasis ArAgeByType = NULL, -->> i = invoice date, d = due date
     @LeftToRight ListYesNoType = NULL, -- >> 0 = right to left, 1 = left to right
     @CurrSite NVARCHAR(8),
     @ShowDetailInfo NVARCHAR(1) = NULL)
AS
BEGIN
    SET NOCOUNT ON

    IF ISNULL(@CurrSite ,'') = '' 
       SET @CurrSite = (SELECT TOP 1 site_ref FROM parms_mst)

    DECLARE @v_StartDate DateType

    SET @Slsman_Starting = ISNULL(@Slsman_Starting, dbo.LowCharacter())
    SET @Slsman_Ending = ISNULL(@Slsman_Ending, dbo.HighCharacter())
    SET @Custnum_Starting = ISNULL(@Custnum_Starting, dbo.LowCharacter())
    SET @Custnum_Ending = ISNULL(@Custnum_Ending, dbo.HighCharacter())
    SET @v_StartDate = dbo.LowDate()
    SET @CutOff_Date = GETDATE()

    EXEC dbo.ApplyDateOffsetSp @v_StartDate OUT, NULL, 0

    EXEC AJU_Rpt_DebtorSp
         @CustNumStart          = @Custnum_Starting
        ,@CustNumEnd            = @Custnum_Ending
        ,@DistDateStart         = @v_StartDate
        ,@DistDateEnd           = @CutOff_Date
        ,@CurrCodeStart         = NULL
        ,@CurrCodeEnd           = NULL
        ,@SlsmanStart           = @Slsman_Starting
        ,@SlsmanEnd             = @Slsman_Ending
        ,@TerritoryStart        = NULL
        ,@TerritoryEnd          = NULL
        ,@CustTypeStart         = NULL
        ,@CustTypeEnd           = NULL
        ,@SiteGroup             = @CurrSite
        ,@ConsolidatePayment    = NULL
        ,@DisplayResult         = 1

END

标签: sql-servertsql

解决方案


由于临时需要初始结果表,您可以执行以下操作:

  1. 在调用过程中,创建一个与被调用过程返回的结构相同的表变量,
  2. 在调用过程中编写如下语句:

    INSERT INTO @_Tempo_Table
        EXEC Invoked_Procedure (<params>) ;
    
  3. 在调用的过程中发出 aSELECT将返回记录集。

另一方面,如果您需要将初始表传递给调用的过程:

  1. 创建一个结构与需要共享的表相同的类型,
  2. 将您刚刚创建的类型的参数添加到调用的过程中(必须声明为READONLY),
  3. 在调用过程中获得包含数据的表后,调用被调用的过程,将表变量作为参数传递。

这种方法将呈现最佳性能(这里我假设您没有传递包含数百万条记录的表;如果这样做,尽管您可能需要大量内存,但它仍然是最快的方法)。


推荐阅读