使用循环从sql中的表中选择值

时间:2015-02-20 14:27:45

标签: sql-server while-loop

我有一个包含一定数量id的表,我想使用这些单独的id来从另一个表中检索数据。

set @CurrentRow = 0
set @RowsToProcess = (SELECT COUNT(*) FROM @QuestionsPrimaryTable)

WHILE(@CurrentRow < @RowsToProcess)
BEGIN
    DECLARE @id int
    DECLARE @value varchar(200)
    SET @CurrentRow = @CurrentRow + 1

    SELECT @id =  Q.QuestionsId FROM @QuestionsPrimaryTable Q
    SET @value = (SELECT Q.QuestionPrimaryDescription FROM QuestionPrimary Q WHERE Q.QuestionPrimaryID = @id)
    PRINT @value

END

我要检索的单独ID值为579 因为目前我只检索9

的值

如何检索单独的id值?

3 个答案:

答案 0 :(得分:2)

我不确定你之后是否真的需要循环。 SQL中很少需要游标,因此如果可能的话,我总是希望在没有游标的情况下实现结果。

您是否正在寻找类似的内容,JOIN QuestionPrimary@QuestionsPrimaryTable,并在ID5 or 7 or 9过滤结果?

SELECT qp.QuestionPrimaryID, qp.QuestionPrimaryDescription 
FROM QuestionPrimary qp
INNER JOIN @QuestionsPrimaryTable qpt 
        ON qp.QuestionPrimaryID = qpt.[JOIN_COLUMN]
WHERE qpt.QuestionPrimaryID IN(5,7,9)

答案 1 :(得分:1)

在基于集合的方法可行的任何地方都应该避免循环。话虽如此,如果你肯定想要一个循环,那么这应该解决你的问题:

SET @CurrentRow = @CurrentRow + 1 -- first value is 1

SELECT @id = Q.QuestionsId 
FROM (
   SELECT QuestionsId, 
          ROW_NUMBER() OVER (ORDER BY QuestionsId) AS rn
   FROM @QuestionsPrimaryTable) Q
WHERE Q.rn =  @CurrentRow

在您的代码中,每次循环迭代都会获取相同的QuestionsId值。使用ROW_NUMBER(),您可以访问@CurrentRow记录。

答案 2 :(得分:1)

如果您绝对需要遍历此数据,则需要在脚本中添加一些内容,这些内容将移至@QuestionsPrimaryTable中的下一条记录。它当前编写的方式在每次迭代时将@Id设置为相同的值。

根据您打算如何使用@QuestionsPrimaryTable,您只需在循环中添加一个删除即可删除您选择的最后一条记录。

set @CurrentRow = 0
set @RowsToProcess = (SELECT COUNT(*) FROM @QuestionsPrimaryTable)

WHILE(@CurrentRow < @RowsToProcess)
BEGIN
    DECLARE @id int
    DECLARE @value varchar(200)
    SET @CurrentRow = @CurrentRow + 1

    SELECT @id =  MAX(Q.QuestionsId) FROM @QuestionsPrimaryTable Q
    SET @value = (SELECT Q.QuestionPrimaryDescription FROM QuestionPrimary Q WHERE Q.QuestionPrimaryID = @id)
    PRINT @value

    DELETE @QuestionsPrimaryTable
    WHERE QuestionsId = @id
END

话虽如此,有可能有更好的方法来实现这一目标。如果您能详细说明您的问题,我们可以为您提供更好的解决方案。