Объединить хранимую процедуру и запрос в T-SQL

Как объединить выполнение хранимой процедуры и использование ее результата или параметров в обычном SQL-запросе?

например, я хотел бы сделать нечто вроде следующего:

-- passing result of SELECT to SP
SELECT a, b FROM t
EXEC my_sp a, b

-- passing result of SP to INSERT    
INSERT INTO t
EXEC my_sp a, b

etc.

2 ответов


нет, вам нужно использовать временную таблицу

create table #results (col1 int, col2 varchar(5) ...)

INSERT INTO #results
   EXEC YourProcedure @parma...

затем вы можете присоединиться к нему

SELECT
    *
    FROM YourTable     y
        JOIN #results  r ON ...
    ....

Если вы не знаете столбцы и типы данных из процедуры вы можете использовать этот отличный ответ: вставить результаты хранимой процедуры во временную таблицу

вкратце он использует OPENROWSET чтобы выполнить хранимую процедуру в таблицу #temp, которая создается на лету, без необходимости называть и знать тип всех столбцов.


Если ваш SP может быть переписан как встроенная таблица с значением UDF, они обычно работают очень хорошо и эквивалентны параметризованному представлению. ITVF можно использовать в любом месте, где вы используете таблицу или представление.

Если ваш SP не будет работать как встроенный TVF (требуется локальная манипуляция переменными), он может работать как мульти-оператор TVF (содержит начало/конец), который может или не может работать плохо в зависимости от того, что вам нужно сделать.

после того, как ваш SP был превращен в UDF, вы можете затем по - прежнему вызывайте UDF из вашего SP (выберите* из udf(params)) или в другом месте он может использоваться для соединений и т. д., Поэтому весь ваш код находится внутри UDF-нет дублирования.