2016-06-15 3 views
1

Я хотел бы выполнить хранимую процедуру X из инструкции SELECT хранимой процедуры Y, так что значение X может быть возвращено как часть данных Y.Выполнить хранимую процедуру из инструкции SELECT другой хранимой процедуры?

Я пробую следующий синтаксис, но он, по-видимому, недействителен.

SELECT name, type, (EXEC X @type=type) 
FROM table 

Как я надеюсь, что вы можете видеть выше, мне нужно передать значение типа текущей строки, чтобы процедура X, чтобы получить надлежащее возвращаемое значение.

Отказ от ответственности: Я, вероятно, просто не знаю, что я делаю.

+1

Вы не можете использовать хранимую процедуру, чтобы получить значение для одного столбца. Возможно, использование хранимой процедуры - неправильный подход? Для чего-то вроде встроенной функции с табличной оценкой было бы более подходящим. –

+0

Я все еще не могу понять, почему вы не можете использовать хранимую процедуру. – Denn

+0

@Denn, потому что хранимая процедура возвращает целое число. Любой результирующий набор фактически не возвращается из хранимой процедуры. И нет никакой гарантии, что он вернет только один результирующий набор. И ничто не мешает нескольким столбцам в заданном наборе результатов. Просто логически не имеет смысла использовать такую ​​процедуру. –

ответ

5

Подход, который вы пробовали, недействителен. Вместо X в качестве хранимой процедуры преобразуйте его как user-defined function. как ниже

Create function dbo.fnGetTypeDetail 
(
@type varchar(50) 
) 
returns varchar(100) 
As 
Begin 
    return --do your operation; 
End 

И заменить ваш запрос как:

SELECT name, type, dbo.fnGetTypeDetail(type) AS TypeDetail 
FROM table 

Для образца я создал скалярную функцию. Основываясь на ваших требованиях, вы можете создать встроенную функцию оценки таблицы в соответствии с example

+2

Я бы согласился, что это сработает, но скалярные функции ужасно неэффективны. И когда они используются в качестве значения столбца, они просто ужасны. –

+0

В ожидании ответов я пошел вперед и смог создать функцию (за оригинальную запись Шона Ланге) и смог получить нужные мне значения. Спасибо всем за ваш вклад. Сохраненный день! – SlowCoder74

0

Вы не можете EXEC сохранить хранимую процедуру внутри оператора SELECT.

Что вы можете сделать, это INSERT..EXEC сохраненный proc в временную таблицу, а затем запустить инструкцию SELECT, которая запрашивает эту временную таблицу, и при необходимости присоединяться к другим таблицам.

псевдопользователей-пример:

INSERT INTO #Tmp (Column1) EXEC X; 

SELECT Name, Type, (SELECT Column1 FROM #tmp) 
FROM MyTable 
Смежные вопросы