Как использовать результаты хранимой процедуры из другой? - PullRequest
11 голосов
/ 14 мая 2009

У меня есть хранимая процедура, которую я хочу вызвать из другой, а затем перебрать результаты. Вроде как использование курсора с хранимой процедурой, а не оператора выбора SQL. Я не могу понять, как это сделать.

Я могу получить весь результат так:

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

Интересно, что это, похоже, меняет тип @result на что-то отличное от int, но неважно. Как мне затем просмотреть результаты, строка за строкой? Как получить доступ к данным из отдельных столбцов? Например, как бы я убил процессы, где четвертый столбец (логин) похож на «% gatesb» или что-то еще?

Ответы [ 4 ]

13 голосов
/ 14 мая 2009

Вы должны объявить табличную переменную для хранения результатов хранимой процедуры, а затем перебрать их в цикле 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
2 голосов
/ 14 мая 2009

вы можете поймать результаты сохраненного процесса, вставив в таблицу с соответствующими столбцами ...

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
*/
2 голосов
/ 14 мая 2009

Переписать sp_who как табличную функцию

0 голосов
/ 14 мая 2009

Джастин указал на то, что вы должны делать, но вместо того, чтобы делать

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...