考虑表SAMPLE:
id integer name nvarchar(10)
有一个称为的存储过程myproc。它只需要一个参数(即id)
myproc
给定名称作为参数,找到带有的所有行name = @nameparameter并将所有这些ID传递给myproc
name = @nameparameter
例如:
sample-> 1 mark 2 mark 3 stu 41 mark
当mark被传递,1 ,2 and 41被传递到myproc个别。
mark
1 ,2 and 41
即应发生以下情况:
execute myproc 1 execute myproc 2 execute myproc 41
我无法触摸myproc也看不到它的内容。我只需要将值传递给它。
如果 必须 进行迭代(*),请使用旨在进行迭代的结构-cursor。我非常讨厌,但是如果它最清楚地表达了您的意图,请说:
DECLARE @ID int DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter OPEN IDs FETCH NEXT FROM IDs into @ID WHILE @@FETCH_STATUS = 0 BEGIN exec myproc @ID FETCH NEXT FROM IDs into @ID END CLOSE IDs DEALLOCATE IDs
(*)这个答案最近得到了一些好评,但是我觉得我也应该在这里加入我的原始评论,并添加一些一般性建议:
在SQL中, 通常 应寻求基于集合的解决方案。整个语言都围绕基于集合的解决方案,(依次)优化器围绕使基于集合的解决方案正常工作。反过来,我们可用于 优化 优化器的工具也是面向集合的-例如,将索引应用于表。
这里有 几个 地方的迭代是最好的办法的情况。这些都是少数是远远之间,并且可以比作杰克逊对优化规则-不要做-和(专家只)不这样做 还 。
首先,根据受影响的所有行的集合,更好地帮助您制定所需的内容- 要实现的总体更改是什么?-然后尝试制定一个包含该目标的查询。只有这样做产生的查询不能充分发挥作用(或者某些其他组件除了单独处理每一行外,无法执行其他任何操作),才应 考虑 迭代。