【问题标题】:How do I pass a parameter in a stored procedure looping values and dump the result set into a temp table?如何在存储过程循环值中传递参数并将结果集转储到临时表中?
【发布时间】:2020-04-17 10:47:26
【问题描述】:

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

我正在循环 CandidateID 和 CandidateListID 并在循环内运行存储过程 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'.

数据存在于我试图循环的表中,并且应该在底部显示来自 temptable select 语句的结果..

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

结束 去吧

【问题讨论】:

  • 您的代码有什么问题?

标签: sql sql-server database stored-procedures parameter-passing


【解决方案1】:

我不打算评论存储过程的几个方面,但我认为你想要:

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;

【讨论】:

  • 嗨,戈登,感谢您的回答,当我尝试运行存储过程时遇到了一些问题。我已经用最新的代码和错误消息编辑了这个问题。你可以看看吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多