我有一个包含一定数量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值为5
,7
,9
因为目前我只检索9
如何检索单独的id值?
答案 0 :(得分:2)
我不确定你之后是否真的需要循环。 SQL中很少需要游标,因此如果可能的话,我总是希望在没有游标的情况下实现结果。
您是否正在寻找类似的内容,JOIN
QuestionPrimary
和@QuestionsPrimaryTable
,并在ID
中5 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
话虽如此,有可能有更好的方法来实现这一目标。如果您能详细说明您的问题,我们可以为您提供更好的解决方案。