我有一个存储过程,我想从另一个内部调用,然后遍历结果。有点像使用带有存储过程的游标而不是SQL select语句。我无法弄明白该怎么做。
我可以得到这样的结果:
DECLARE @result int;
EXEC @result = sp_who;
PRINT @result;
有趣的是,这似乎将@result的类型改为int以外的东西,但无论如何。然后,我如何逐行循环结果?如何访问各列的数据?例如,我如何杀死第四列(loginname)就像'%gatesb'或其他什么的进程?
答案 0 :(得分:13)
您将声明一个表变量来保存存储过程的结果,然后在while循环中循环它们:
declare @temp table (
idx int identity(1,1),
field1 int,
field2 varchar(max))
declare @result int
insert into @temp (field1, field2)
exec @result = sp_who
declare @counter int
set @counter = 1
while @counter < (select max(idx) from @temp)
begin
-- do what you want with the rows here
set @counter = @counter + 1
end
答案 1 :(得分:2)
将sp_who重写为表函数
答案 2 :(得分:2)
您可以通过插入具有匹配列的表来捕获存储过程的结果...
create table #spWhoResults
(spid smallint,
ecid smallint,
status nchar(60),
loginame nchar(256),
hostname nchar(256),
blk char(5),
dbname nvarchar(128),
cmd nchar(32),
request_id int)
go
insert #spWhoResults
exec sp_who
select *
from #spWhoResults
/*
put your cursor here to loop #spWhoResults to
perform whatever it is you wanted to do per row
*/
答案 3 :(得分:0)
Justin指出的是你必须做的事情,而不是做
while @counter < (select max(idx) from @temp)
这样做
declare @maxid int
select @maxid = max(idx), @counter = 1
from @temp
while @counter < @maxid begin
-- go on
set @counter = @counter + 1
end
另外,如果将表声明为@temp不起作用,则可以将其声明为#temp。