admin

遍历SQL Server 2008中的行

sql

考虑表SAMPLE:

id       integer
name     nvarchar(10)

有一个称为的存储过程myproc。它只需要一个参数(即id)

给定名称作为参数,找到带有的所有行name = @nameparameter并将所有这些ID传递给myproc

例如:

sample->
1   mark
2   mark
3   stu
41  mark

mark被传递,1 ,2 and 41被传递到myproc个别。

即应发生以下情况:

execute myproc 1
execute myproc 2
execute myproc 41

我无法触摸myproc也看不到它的内容。我只需要将值传递给它。


阅读 210

收藏
2021-05-10

共1个答案

admin

如果 必须 进行迭代(*),请使用旨在进行迭代的结构-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中, 通常 应寻求基于集合的解决方案。整个语言都围绕基于集合的解决方案,(依次)优化器围绕使基于集合的解决方案正常工作。反过来,我们可用于
优化 优化器的工具也是面向集合的-例如,将索引应用于表。

这里有 几个 地方的迭代是最好的办法的情况。这些都是少数是远远之间,并且可以比作杰克逊对优化规则-不要做-和(专家只)不这样做

首先,根据受影响的所有行的集合,更好地帮助您制定所需的内容-
要实现的总体更改是什么?-然后尝试制定一个包含该目标的查询。只有这样做产生的查询不能充分发挥作用(或者某些其他组件除了单独处理每一行外,无法执行其他任何操作),才应
考虑 迭代。

2021-05-10