Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Вызов процедуры из процедуры по имени из строки


Автор: YanTsys 22.5.2009, 12:24
Как из хранимой процедуру выполнить другую процедуру по ее имени в текстовой строке и потом получить обратно возвращаемый параметр?

Что то вроде
Код

CREATE PROCEDURE y_exe_startproc
@NumCommand int output
AS
DECLARE @Num  int;
begin

    exec ("y_exe_proc0001 @Num =@Num output;");
    SET @NumCommand = @Num;
    
end
GO



Автор: KostaPC 22.5.2009, 14:32
Код

declare @query nvarchar(max)
set @uqery = (select "exec y_exe_proc001"+@any_add_text+" output");
sp_executesql @query


Что-то вроде этого.
Просто не до конца понял что именно нужно сделать.

Автор: YanTsys 22.5.2009, 16:43
Нужно имея несколько процедур  разными именами и с одинаковым перечнем параметров
"y_exe_proc0001"
"y_exe_proc0002"
"y_exe_proc0003"
"y_exe_proc0004"
"y_exe_proc0005"
запустить одну из них и потом считать возвращенное значение.

нужно разбить процедуру на большое количество различных способов ее выполнения так чтобы не делать аналог
switch 
case 1
case 2
case 3

так как команда exec ("y_exe_proc0001") принимает текстовое название процедуры то дело только за возвратом параметров, а тут уперся лбом и никак...  smile 

Автор: KostaPC 22.5.2009, 16:57
Может сделать в процедурах
"y_exe_proc000X" OUT параметр ?

Тогда вроде как дожно работать так:

Код

declare @query nvarchar(max)
decrate @return_value int
set @uqery = (select "exec y_exe_proc00"+@num+", @return_value output")
EXEC(@query)

Автор: YanTsys 24.5.2009, 21:00
Спасибо большое очень помогла ваша процедура sp_executesql

Заработал такой тестовый код

Код

CREATE PROCEDURE y_exe_startproc
@Test nvarchar(200) output

AS

DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

begin

SET @SQLString = N'exec y_exe_proc0001 @Num output';
SET @ParmDefinition = N'@Num nvarchar(25) OUTPUT';

EXECUTE sp_executesql
    @SQLString
    ,@ParmDefinition
    ,@Num = @Test OUTPUT;

SELECT @Test;

end
GO


Теперь остается только подставлять текстовое название процедуры.

Теперь буду разбираться как запустить процедуру по какому нибудь системному идентификатору...
Если разбираться с OBJECT_ID() это правильное направление поиска?


Автор: KostaPC 25.5.2009, 10:47
Думаю правильное направление, хотя не могу точно сказать, не работал с OJECT_ID() более глубоко, чем проверка на существование объекта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)