2009-05-14 5 views
7

J'ai une procédure stockée que je veux appeler à partir d'un autre, et puis en boucle les résultats. Un peu comme utiliser un curseur avec une procédure stockée plutôt qu'une instruction de sélection SQL. Je n'arrive pas à comprendre comment le faire.Comment utiliser les résultats d'une procédure stockée dans une autre?

je peux obtenir tout le résultat comme celui-ci:

DECLARE @result int; 
EXEC @result = sp_who; 
PRINT @result; 

Fait intéressant, cela semble changer le type de @result à autre chose que int, mais peu importe. Comment puis-je parcourir les résultats, rangée par rangée? Comment accéder aux données des différentes colonnes? Par exemple, comment est-ce que je tuerais des processus où la quatrième colonne (loginname) est comme '% gatesb' ou quoi que ce soit?

+1

Cela a déjà été demandé ici: http://stackoverflow.com/questions/149132/how-can-one-iterate-over-stored-procedure-results-from-within-another-stored-proc –

Répondre

8

Vous déclarez une variable de table pour tenir les résultats de la procédure stockée et ensuite en boucle à travers eux dans une boucle while:

declare @temp table (
    idx int identity(1,1), 
    field1 int, 
    field2 varchar(max)) 

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 
+0

Sweet - cela fonctionne. Juste besoin de remplacer '@temp' par '#temp' et 'exec @result = sp_who' par 'exec sp_who'. Merci pour ça. – TallGuy

+1

Vous devriez pouvoir utiliser une variable de table [@temp] plutôt qu'une table temporaire [#temp]. Si vous devez utiliser une table temporaire, assurez-vous de laisser tomber la table lorsque vous en avez fini avec elle ... sinon elle va traîner. –

+0

Qu'est-ce que je déclare le résultat en tant que? 'Doit déclarer la variable scalaire" @result ".' – PeterX

1

sp_who Réécriture en fonction de la table

+2

Je suppose vous voulez dire, "réécrire votre proc stocké comme une fonction de valeur de table." Je ne pense pas réimplémenter un système stocké proc est une bonne idée;) – onedaywhen

2

vous pouvez attraper les résultats d'un proc stocké en insérant dans une table qui comporte des colonnes correspondant ...

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 
*/ 
0

ce qui a Justin est sur ce que vous avez à faire, mais au lieu de faire

while @counter < (select max(idx) from @temp) 

faire ce

declare @maxid int 
select @maxid = max(idx), @counter = 1 
from @temp 
while @counter < @maxid begin 
-- go on 
    set @counter = @counter + 1 
end 

En outre, si la table comme déclarant @temp ne vous pas pu travailler déclarer comme #temp.

Questions connexes