我如何在存储过程中传递参数以循环值并将结果集转储到临时表中?

问题描述 投票:0回答:1

如何创建存储过程,可以将@CandidatelistID作为参数传递给下面的现有存储过程逻辑。

我正在循环CandidateIDCandidateListID,并在循环内运行存储过程usp_ApplyRankingRules以获取它们各自的Weightage

然后,而不是插入并更新表中的值-RPT_CandidateCardReport我想在临时表中加载相同的字段。当我这样做时,出现以下错误-

(0 row(s) affected)

(0 row(s) affected)
Msg 208, Level 16, State 0, Procedure usp_RPT_CandidateCardReporttest, Line     24 [Batch Start Line 53]
Invalid object name '#tempRPTCandidateCardReport'.

数据存在于我要循环的表中,并且应该在底部显示临时模板选择语句的结果。

CREATE PROCEDURE [dbo].[usp_RPT_CandidateCardReporttest]     @candidateListIDs varchar(36)
    AS
    BEGIN
declare @candidateListID varchar(36)
declare @candidateID varchar(36)
declare @var_weightage decimal
declare @listcount INT = (SELECT COUNT(1) FROM CandidateList_Candidates)
declare @loopcount INT = 1


IF OBJECT_ID('tempdb..#tmpListCandidate') IS NOT NULL DROP TABLE #tmpListCandidate
SELECT CandidateListID, CandidateID, ROW_NUMBER()OVER(ORDER BY cl.CandidateID) AS Id INTO #tmpListCandidate 
FROM CandidateList_Candidates cl
where CandidateListID = @candidateListIDs

WHILE(@loopcount <= @listcount)
    BEGIN
        SET @candidateListID = (SELECT CandidateListID FROM #tmpListCandidate WHERE Id = @loopcount)
        SET @candidateID = (SELECT CandidateID FROM #tmpListCandidate WHERE Id = @loopcount)

        EXEC usp_ApplyRankingRules @candidateListID, @candidateID, @var_weightage OUTPUT

        IF EXISTS (SELECT 1 FROM #tempRPTCandidateCardReport WHERE listID = @candidateListID AND candidateID = @candidateID)
            BEGIN
                UPDATE #tempRPTCandidateCardReport SET weightage = @var_weightage WHERE listID = @candidateListID AND candidateID = @candidateID
            END
        ELSE
            BEGIN    
                INSERT INTO #tempRPTCandidateCardReport (listID, candidateID, weightage)
                    VALUES (@candidateListID, @candidateID, @var_weightage) 
            END
        SET @loopcount = @loopcount + 1
    END

select listid,candidateid,weightage from #tempRPTCandidateCardReport

IF OBJECT_ID('tempdb..#tmpListCandidate') IS NOT NULL 
BEGIN 
    DROP TABLE #tmpListCandidate
    DROP TABLE #tempRPTCandidateCardReport
END

END转到

sql sql-server database stored-procedures parameter-passing
1个回答
0
投票

我不打算对存储过程的多个方面发表评论,但我想您想要这样做:

CREATE PROCEDURE [dbo].[usp_RPT_CandidateCardReporttest] ( 
   @candidateListID varchar(36)
)
AS
BEGIN
    . . . 
    SELECT CandidateListID, CandidateID, 
           ROW_NUMBER() OVER (ORDER BY cl.CandidateID) AS Id 
    INTO #tmpListCandidate 
    FROM CandidateList_Candidates cl
    WHERE CandidateListID = @CandidateListID OR @CandidateListID IS NULL;

    SELECT @ListCounct = COUNT(*)
    FROM #tmpListCandidate ;

    . . .
END;

注意:

  • 根据临时表中的行数设置行数。上面的代码使用SELECT COUNT(*)是明确的,但是@@ROWCOUNT也可以。
  • 无需删除临时表或测试临时表的存在。临时表将仅在存储过程的每次调用期间都处于“活动”状态。
  • 但是。 。 。我实际上建议使用游标代替。我不喜欢游标,但是对于结果集的每一行调用存储过程的用例绝对是它们有用的地方。这样就不需要临时表或循环值了。

如果要遍历一个临时表(或表变量),则应使用如下代码:

   SET @candidateListID = (SELECT CandidateListID FROM #tmpListCandidate WHERE Id = @loopcount)
   SET @candidateID = (SELECT CandidateID FROM #tmpListCandidate WHERE Id = @loopcount)

可以替换为:

SELECT @candidateListID = CandidateListID,
       @candidateID = CandidateID
FROM #tmpListCandidate
WHERE Id = @loopcount;
© www.soinside.com 2019 - 2024. All rights reserved.