psy*_*psy 19 sql sql-server-2008
考虑表SAMPLE:
id integer
name nvarchar(10)
Run Code Online (Sandbox Code Playgroud)
有一个存储过程称为myproc
.它只需要一个参数(即id)
给定一个名称作为参数,找到所有行name = @nameparameter
并将所有这些ID传递给myproc
例如:
sample->
1 mark
2 mark
3 stu
41 mark
Run Code Online (Sandbox Code Playgroud)
当mark
通过后,1 ,2 and 41
将被传递到myproc
个别.
即应发生以下情况:
execute myproc 1
execute myproc 2
execute myproc 41
Run Code Online (Sandbox Code Playgroud)
我无法触摸myproc
也看不到它的内容.我只需将值传递给它.
Dam*_*ver 43
如果必须迭代(*),请使用设计用于执行此操作的构造 - 光标.非常诽谤,但如果它最清楚地表达了你的意图,我说使用它:
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
Run Code Online (Sandbox Code Playgroud)
(*)这个答案最近收到了一些赞成,但我觉得我也应该在这里加入我的原始评论,并添加一些一般建议:
在SQL中,您通常应该寻求基于集合的解决方案.整个语言都围绕基于集合的解决方案,而(反过来)优化器的目标是使基于集合的解决方案运行良好.进一步说,我们可用于调优优化器的工具也是面向集合的 - 例如将索引应用于表.
这里有几个地方的迭代是最好的办法的情况.这些都是少数是远远之间,并且可以比作杰克逊对优化规则-不要做-和(专家只)不这样做还.
你最好尝试根据受影响的所有行的集合来制定你想要的东西 - 要实现的整体变化是什么? - 然后尝试制定封装该目标的查询.只有当通过这样做产生的查询没有充分执行时(或者除了单独处理每一行之外还有一些其他组件无法执行任何操作),您应该考虑迭代.
我只是声明临时表@sample并插入名称为''rahul'的所有行,并且还使用status列检查该行是否已迭代.并使用while循环迭代临时表@sample的所有行其中包含name ='rahul'的所有id
use dumme
Declare @Name nvarchar(50)
set @Name='Rahul'
DECLARE @sample table (
ID int,
Status varchar(500)
)
insert into @sample (ID,status) select ID,0 from sample where sample=@name
while ((select count(Id) from @sample where status=0 )>0)
begin
select top 1 Id from @sample where status=0 order by Id
update @sample set status=1 where Id=(select top 1 Id from @sample where status=0 order by Id)
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
61768 次 |
最近记录: |