Объединить хранимую процедуру и запрос в 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
и др.
Ответы
Ответ 1
нет, вам нужно использовать временную таблицу
create table #results (col1 int, col2 varchar(5) ...)
INSERT INTO #results
EXEC YourProcedure @parma...
то вы можете присоединиться к нему
SELECT
*
FROM YourTable y
JOIN #results r ON ...
....
Если вы не знаете столбцы и типы данных из процедуры, вы можете использовать этот отличный ответ: Вставить результаты хранимой процедуры во временную таблицу
Вкратце, он использует OPENROWSET
для выполнения хранимой процедуры в таблице #temp, которая создается "на лету", без необходимости указывать и знать тип всех столбцов.
Ответ 2
Если ваш SP может быть переписан как встроенный табличный UDF, они обычно выполняются очень хорошо и эквивалентны параметризованному представлению. ITVF можно использовать в любом месте, где вы бы использовали таблицу или представление.
Если ваш SP не будет работать как встроенный TVF (требуется локальная переменная), он может работать как многозадачный TVF (содержит BEGIN/END), который может или не может работать плохо в зависимости от того, сделать.
После того как ваш SP был превращен в UDF, вы все равно можете вызвать UDF из своего SP (SELECT * FROM udf (params)) или в другом месте, где он может использоваться для соединений и т.д., поэтому весь ваш код находится внутри UDF - нет дублирования.