Как я комбинирую выполнение хранимой процедуры и использование ее результата или параметров в регулярном 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
и т.д.
нет, вам нужно использовать temp table
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 с несколькими операторами (содержит BEGIN / END), который может работать или не работать плохо в зависимости от того, что вам нужно. делать.
После того, как ваш SP был преобразован в UDF, вы все еще можете вызывать UDF из вашего SP (SELECT * FROM udf (params)) или где-то еще, его можно использовать для объединений и т. Д., Поэтому весь ваш код находится внутри UDF - без дублирования.