Можно ли использовать хранимую процедуру в качестве подзапроса в SQL Server 2008? - PullRequest
18 голосов
/ 03 февраля 2011

У меня есть две хранимые процедуры, одна из которых возвращает список платежей, а другая возвращает сводку этих платежей, сгруппированных по валютам.Прямо сейчас у меня есть дублированный запрос: основным запросом хранимой процедуры, которая возвращает список платежей, является подзапрос хранимой процедуры, которая возвращает сводку платежей по валютам.Я хотел бы устранить эту двойственность, сделав хранимую процедуру, которая возвращает список платежей, подзапросом хранимой процедуры, которая возвращает сводку платежей по валютам.Это возможно в SQL Server 2008?

Ответы [ 5 ]

18 голосов
/ 03 февраля 2011

Вам лучше преобразовать первый процесс в функцию TABLE-VALUED. Если он включает несколько операторов, вам нужно сначала определить структуру возвращаемой таблицы и заполнить ее.

Пример:

CREATE proc getRecords @t char(1)
as
set nocouut on;
-- other statements --
-- final select
select * from master..spt_values where type = @t
GO

- становится -

CREATE FUNCTION fn_getRecords(@t char(1))
returns @output table(
    name sysname,
    number int,
    type char(1),
    low int,
    high int,
    status int) as
begin
-- other statements --
-- final select
insert @output
select * from master..spt_values where type = @t
return
end;

Однако, если это прямой выбор (или его можно записать как одно утверждение), вы можете использовать форму INLINE tvf, которая высоко оптимизирована

CREATE FUNCTION fn2_getRecords(@t char(1))
returns table as return
-- **NO** other statements; single statement table --
select * from master..spt_values where type = @t

Второй процесс просто выбирает из первого процесса

create proc getRecordsByStatus @t char(1)
as
select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t)
group by status

А где ты раньше звонил

EXEC firstProc @param

чтобы получить результат, вы теперь выбираете из него

SELECT * FROM firstProc(@param)
6 голосов
/ 03 февраля 2011

Вставка результатов вашего сохраненного процесса в табличную переменную или временную таблицу сделает свое дело.

Если вы пытаетесь повторно использовать код в SQL Server от одного запроса к другому, у вас больше гибкостис табличными функциями.Представления в порядке, если вам не нужно передавать параметры или использовать какую-либо логику управления потоком.Они могут использоваться как таблицы в любой другой функции, процедуре, представлении или операторе t-sql.

6 голосов
/ 03 февраля 2011

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

Захватить выходные данные хранимой процедуры, возвращая столбцы ID и Имя в переменную таблицы.

declare @T table (ID int, Name nvarchar(50))

insert into @T
exec StoredProcedure
3 голосов
/ 03 февраля 2011

Если вы сделали процедуру, которая возвращает список в табличную функцию, то, я думаю, вы могли бы использовать ее в подзапросе.

1 голос
/ 03 февраля 2011

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

...