Объедините хранимую процедуру и запрос в T-SQL - PullRequest
19 голосов
/ 01 апреля 2010

Как мне объединить выполнение хранимой процедуры и использование ее результата или параметров в обычном запросе 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

и т.д.

Ответы [ 2 ]

24 голосов
/ 01 апреля 2010

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

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

INSERT INTO #results
   EXEC YourProcedure @parma...

, тогда вы можете присоединиться к ней

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

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

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

4 голосов
/ 02 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...