2009-05-14 20 views
7

Bir başkasından aramak istediğim bir saklı yordamım var ve sonuçların arasında dolaşıyor. Bir SQL select deyimi yerine saklı bir yordamla bir imleci kullanarak beğenme. Nasıl yapılacağını tam olarak anlayamıyorum.Bir saklı yordamın sonuçlarını bir diğerinden nasıl kullanırım?

böyle bütün sonucu alabilirsiniz:

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

İlginçtir, bu int dışındaki bir şey, ama ne olursa olsun hiç @result türünü değiştirmek gibi görünüyor. Daha sonra sonuçlara göre sıralı olarak sıralı mıyım? Verilere bireysel sütunlardan nasıl erişilir? Örneğin, dördüncü sütunun (loginname) '% gatesb' gibi olduğu süreçleri nasıl öldürebilirim?

bir tablo fonksiyonu olarak
+1

Bu daha önce burada sorulmuştur: http://stackoverflow.com/questions/149132/how-can-one-iterate-over-stored-procedure-results-from-within-another-stored-proc –

cevap

8

Bir süre döngü içinde bunlar aracılığıyla saklı yordam sonuçlarını ve döngü tutmak için bir tablo değişkeni bildirmek istiyoruz:

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

Tatlı - bu işe yarıyor. '#temp' ve 'exec @result = sp_who' ifadelerini 'exec sp_who' ile değiştirmeniz gerekiyor. Bunun için teşekkürler. – TallGuy

+1

Bir temp tablosu [#temp] yerine bir tablo değişkeni [@temp] kullanabilmeniz gerekir. Bir geçici tablo kullanmanız gerekiyorsa, işiniz bittiğinde tablayı bıraktığınızdan emin olun ... aksi takdirde takılabilir. –

+0

Sonucu olarak ne bildiririm? "Skaler değişkeni bildirmeli" ("sonuç"). – PeterX

1

Rewrite Sp_who

+2

Varsayalım "Depolanmış proc'yu bir tablo değeri işlevi olarak yeniden yaz." Saklanan bir sistemi reimplement düşünmüyorum iyi bir fikir olduğunu;) – onedaywhen

2

sonuçları yakalayabilirsiniz eşleşen sütunları olan bir tabloya yerleştirerek saklı bir yordam ... Justin işaret ne

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

ancak bunun yerineyapmanın, yapmanız gereken budur tablo bildirerek eğer @temp sen #temp olarak ilan verebilir çalışmıyor olarak

while @counter < (select max(idx) from @temp) 
, Ayrıca, bu

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

yapmak.

İlgili konular